469,312 Members | 2,440 Online

# Double backslashes \\ in strings

I have a function textag($expression){...} whose$expression argument is a string that
can contain substrings like \alpha with one
backslash or like a&b\\c&d with two backslashes.

If I write <?php textag('\alpha'); ?with the
expression argument in single quotes, then that
works fine, and the single backslash isn't
interpreted or changed, which is what I want.
But if I write <?php textag('a&b\\c&d'); ?>
then the double \\ gets translated to a single \,
which isn't what I want. Now, I can write
<?php textag('a&b\\\\c&d'); ?to get a&b\\c&d,
but that's quit inconvenient and kludgey.

Is there some way to fix this that's transparent
to the user calling textag()? I can't really
do any kind of preg_replace, because that would
also change the originally correct \alpha to
incorrect \\alpha. Thanks for any suggestions,
--
John Forkosh ( mailto: j@f.com where j=john and f=forkosh )
Sep 24 '08 #1
7 11499

JohnF schreef:
I have a function textag($expression){...} whose$expression argument is a string that
can contain substrings like \alpha with one
backslash or like a&b\\c&d with two backslashes.

If I write <?php textag('\alpha'); ?with the
expression argument in single quotes, then that
works fine, and the single backslash isn't
interpreted or changed, which is what I want.
But if I write <?php textag('a&b\\c&d'); ?>
then the double \\ gets translated to a single \,
which isn't what I want. Now, I can write
<?php textag('a&b\\\\c&d'); ?to get a&b\\c&d,
but that's quit inconvenient and kludgey.

Is there some way to fix this that's transparent
to the user calling textag()? I can't really
do any kind of preg_replace, because that would
also change the originally correct \alpha to
incorrect \\alpha. Thanks for any suggestions,
Hi,

Nobody mentioned preg_replace. ;-)

http://www.php.net/manual/en/language.types.string.php

Regards,
Erwin Moller

--
============================
Erwin Moller
Now dropping all postings from googlegroups.
Why? http://improve-usenet.org/
============================
Sep 24 '08 #2
Erwin Moller < wrote:
JohnF schreef:
>I have a function textag($expression){...} whose$expression argument is a string that
can contain substrings like \alpha with one
backslash or like a&b\\c&d with two backslashes.

If I write <?php textag('\alpha'); ?with the
expression argument in single quotes, then that
works fine, and the single backslash isn't
interpreted or changed, which is what I want.
But if I write <?php textag('a&b\\c&d'); ?>
then the double \\ gets translated to a single \,
which isn't what I want. Now, I can write
<?php textag('a&b\\\\c&d'); ?to get a&b\\c&d,
but that's quit inconvenient and kludgey.

Is there some way to fix this that's transparent
to the user calling textag()? I can't really
do any kind of preg_replace, because that would
also change the originally correct \alpha to
incorrect \\alpha. Thanks for any suggestions,

Hi,
Nobody mentioned preg_replace. ;-)
http://www.php.net/manual/en/language.types.string.php
Regards,
Erwin Moller
Thanks, Erwin. I only mentioned preg_replace because
it had crossed my mind, but then I realized that would
be barking up the wrong tree.

The examples on
http://www.php.net/manual/en/language.types.string.php
include these two...
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
and
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
which indeed illustrate the problem,
i.e., \ outputs \, but \\ also outputs \.

But I don't see any way to solve it that's
mentioned there, short of writing
// Outputs: You deleted C:\\*.*?
echo 'You deleted C:\\\\*.*?';
which is what I don't want to force users to do.
That is, if they want \\, they should be able to type \\
rather than \\\\. Am I missing something on that
page that addresses this problem? Thanks again,
--
John Forkosh ( mailto: j@f.com where j=john and f=forkosh )
Sep 24 '08 #3
..oO(JohnF)
>The examples on
http://www.php.net/manual/en/language.types.string.php
include these two...
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
and
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
which indeed illustrate the problem,
i.e., \ outputs \, but \\ also outputs \.

But I don't see any way to solve it that's
mentioned there, short of writing
// Outputs: You deleted C:\\*.*?
echo 'You deleted C:\\\\*.*?';
which is what I don't want to force users to do.
How will users use your function? Will they call it directly from within
their own scripts or does it receive data from an HTML form? It makes a
difference if you get a string value from some source (form, database,
whatever) or if you create it on your own. In the latter case you have
to take PHP's rules for string parsing and escaping into account, while
in the first case there shouldn't be any problem.

Micha
Sep 24 '08 #4
Michael Fesser <ne*****@gmx.dewrote:
.oO(JohnF)
>>The examples on
http://www.php.net/manual/en/language.types.string.php
include these two...
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
and
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
which indeed illustrate the problem,
i.e., \ outputs \, but \\ also outputs \.

But I don't see any way to solve it that's
mentioned there, short of writing
// Outputs: You deleted C:\\*.*?
echo 'You deleted C:\\\\*.*?';
which is what I don't want to force users to do.

How will users use your function? Will they call it directly from within
their own scripts or does it receive data from an HTML form? It makes a
difference if you get a string value from some source (form, database,
whatever) or if you create it on your own. In the latter case you have
to take PHP's rules for string parsing and escaping into account, while
in the first case there shouldn't be any problem.
Thanks, Micha. Specifically, the function will be used as
described at
http://www.forkosh.com/mimetex.html?valignment
That is, users will typically use it from within their own
scripts in exactly the form illustrated in the original post:
<?php textag('\begin{matrix}a&b\\c&d\end{matrix}); ?>
is a full example with both \'s and \\'s. The markup
syntax is LaTeX's, and it would be nice if users could
write it in its standard form. Writing \\\\ for \\
might be hard (and inconvenient) for them to remember all the time.
You seem to be saying that "in the first case there
shouldn't be any problem". But isn't this your first case?
And I'm not seeing how to avoid the problem. Thanks again,
--
John Forkosh ( mailto: j@f.com where j=john and f=forkosh )
Sep 24 '08 #5

JohnF schreef:
Erwin Moller < wrote:
>JohnF schreef:
>>I have a function textag($expression){...} whose$expression argument is a string that
can contain substrings like \alpha with one
backslash or like a&b\\c&d with two backslashes.

If I write <?php textag('\alpha'); ?with the
expression argument in single quotes, then that
works fine, and the single backslash isn't
interpreted or changed, which is what I want.
But if I write <?php textag('a&b\\c&d'); ?>
then the double \\ gets translated to a single \,
which isn't what I want. Now, I can write
<?php textag('a&b\\\\c&d'); ?to get a&b\\c&d,
but that's quit inconvenient and kludgey.

Is there some way to fix this that's transparent
to the user calling textag()? I can't really
do any kind of preg_replace, because that would
also change the originally correct \alpha to
incorrect \\alpha. Thanks for any suggestions,
Hi,
Nobody mentioned preg_replace. ;-)
http://www.php.net/manual/en/language.types.string.php
Regards,
Erwin Moller

Thanks, Erwin. I only mentioned preg_replace because
it had crossed my mind, but then I realized that would
be barking up the wrong tree.

Hi,

Well, the problem is still a little vague to me.

And yes, escaping can be very confusing. ;-)
Try feeding \ to complex regular expression from PHP if you want a heavy
The examples on
http://www.php.net/manual/en/language.types.string.php
include these two...
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
and
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
which indeed illustrate the problem,
i.e., \ outputs \, but \\ also outputs \.
Correct.
Reason is that with single quote the \ is treated in the context you use
it in.
Single quoted

The simplest way to specify a string is to enclose it in single quotes
(the character ').

To specify a literal single quote, escape it with a backslash (\). To
specify a literal backslash before a single quote, or at the end of the
string, double it (\\). Note that attempting to escape any other
character will print the backslash too.
Try running these, and see if it makes sense to you:
SQ = single quotes, and BS is .... backslash. :P

echo 'SQ, BS will not escape since the next char is a b: \bla';
echo '<br>';
echo 'SQ, BS will escape since the next char is a quote: \'bla';
echo '<br>';
echo 'SQ, BS will escape since the next char is a BS : \\bla';
echo '<br>';
echo 'SQ, Now ending a string with SQ: \'bla\'';
echo '<br>';
echo 'SQ, Now ending a string with SQ with BS in it: \'\\bla\\\'';
>
But I don't see any way to solve it that's
mentioned there, short of writing
// Outputs: You deleted C:\\*.*?
echo 'You deleted C:\\\\*.*?';
which is what I don't want to force users to do.
That is, if they want \\, they should be able to type \\
rather than \\\\. Am I missing something on that
page that addresses this problem? Thanks again,
You might have a look at the function addslashes()

Tip: Do NOT use addslashes to make a string safe for use in SQL, it is
not enough.

Hope this helps.

And, test a lot, also check your php.ini for possible confusing settings
like magic_quotes_gpc.

Regards,
Erwin Moller

--
============================
Erwin Moller
Now dropping all postings from googlegroups.
Why? http://improve-usenet.org/
============================
Sep 25 '08 #6
Erwin Moller < wrote:
JohnF schreef:
>Erwin Moller < wrote:
>>JohnF schreef:
I have a function textag($expression){...} whose$expression argument is a string that
can contain substrings like \alpha with one
backslash or like a&b\\c&d with two backslashes.

If I write <?php textag('\alpha'); ?with the
expression argument in single quotes, then that
works fine, and the single backslash isn't
interpreted or changed, which is what I want.
But if I write <?php textag('a&b\\c&d'); ?>
then the double \\ gets translated to a single \,
which isn't what I want. Now, I can write
<?php textag('a&b\\\\c&d'); ?to get a&b\\c&d,
but that's quit inconvenient and kludgey.

Is there some way to fix this that's transparent
to the user calling textag()? I can't really
do any kind of preg_replace, because that would
also change the originally correct \alpha to
incorrect \\alpha. Thanks for any suggestions,

Nobody mentioned preg_replace. ;-)
http://www.php.net/manual/en/language.types.string.php

Thanks, Erwin. I only mentioned preg_replace because
it had crossed my mind, but then I realized that would
be barking up the wrong tree.

Well, the problem is still a little vague to me.
An analogous problem would be: suppose you want to
echo two backslashes; you'd have to use the statement
echo '\\\\';
with four backslashes instead. Now, I can see why
you have to type echo "\\\\"; since escaped chars are
translated inside "double quotes". But they're not
translated inside 'single quotes', so why can't you
type echo '\\'; to get \\?
Maybe it's still vague why I seem so lazy that
I don't want to type a few extra backslashes. That's
because the real problem is that users will be typing
these strings, not to echo them, but as arguments to
a function like <?php textag('a\\b'); ? where
the letter a is followed by two \\ backslashes
(not one \) and then followed by the letter b.
Users will not expect to need to type four
backslashes when they want two, and that's liable
to cause problems I'd rather avoid.
--
John Forkosh ( mailto: j@f.com where j=john and f=forkosh )
Sep 26 '08 #7

JohnF schreef:
Erwin Moller < wrote:
>JohnF schreef:
>>Erwin Moller < wrote:
JohnF schreef:
I have a function textag($expression){...} whose$expression argument is a string that
can contain substrings like \alpha with one
backslash or like a&b\\c&d with two backslashes.
>
If I write <?php textag('\alpha'); ?with the
expression argument in single quotes, then that
works fine, and the single backslash isn't
interpreted or changed, which is what I want.
But if I write <?php textag('a&b\\c&d'); ?>
then the double \\ gets translated to a single \,
which isn't what I want. Now, I can write
<?php textag('a&b\\\\c&d'); ?to get a&b\\c&d,
but that's quit inconvenient and kludgey.
>
Is there some way to fix this that's transparent
to the user calling textag()? I can't really
do any kind of preg_replace, because that would
also change the originally correct \alpha to
incorrect \\alpha. Thanks for any suggestions,
Nobody mentioned preg_replace. ;-)
http://www.php.net/manual/en/language.types.string.php
Thanks, Erwin. I only mentioned preg_replace because
it had crossed my mind, but then I realized that would
be barking up the wrong tree.
Well, the problem is still a little vague to me.
An analogous problem would be: suppose you want to
echo two backslashes; you'd have to use the statement
echo '\\\\';
with four backslashes instead. Now, I can see why
you have to type echo "\\\\"; since escaped chars are
translated inside "double quotes". But they're not
translated inside 'single quotes', so why can't you
type echo '\\'; to get \\?
Maybe it's still vague why I seem so lazy that
I don't want to type a few extra backslashes. That's
because the real problem is that users will be typing
these strings, not to echo them, but as arguments to
a function like <?php textag('a\\b'); ? where
the letter a is followed by two \\ backslashes
(not one \) and then followed by the letter b.
Users will not expect to need to type four
backslashes when they want two, and that's liable
to cause problems I'd rather avoid.
Did you understand it all?

All your confusion and problems are unneeded, nor is it needed for the
users to type 4 slashes if they want 2.

Regards,
Erwin Moller

--
============================
Erwin Moller
Now dropping all postings from googlegroups.
Why? http://improve-usenet.org/
============================
Oct 2 '08 #8

### This discussion thread is closed

Replies have been disabled for this discussion.