By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
429,480 Members | 763 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 429,480 IT Pros & Developers. It's quick & easy.

strange behaviour: preg_replace with /e modifier and str_replace

P: n/a
Hi there,

I'm trying to replace single quoted attributes in HTML tags with double
quotes. What I've come up with is this:

function replaceSingleQuotesInsideTags( $input )
{
$output = preg_replace(
'/<[^>]*>/e',
"str_replace( '\'', '\"', '$0' )",
$input
);
return $output;
}

So let's say I have this string of HTML code:

On <A href="/home/" target="_self">this</Apage you will find <SPAN
STYLE='font-style: italic'>stuff</SPAN>

Result:
On <A href=\"/home/\" target=\"_self\">this</Apage you will find <SPAN
STYLE="font-style: italic">stuff</SPAN>

As you can see, when I run it through my function
replaceSingleQuotesInsideTags, not only does it replace the single quotes
with double quotes, but it also adds backslashes before double quotes that
were already present. This is unexpected behaviour to me.

Expected result:
On <A href="/home/" target="_self">this</Apage you will find <SPAN
STYLE="font-style: italic">stuff</SPAN>

Note the missing backslashes in the anchor tag attributes.

Does anybody have an idea of what is going on here?

Working with PHP 5.1.4, magic_quotes (all) off.

Thank you in advance.
May 28 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
At Mon, 28 May 2007 08:18:14 +0200, amygdala let h(is|er) monkeys type:
Hi there,

I'm trying to replace single quoted attributes in HTML tags with double
quotes. What I've come up with is this:

function replaceSingleQuotesInsideTags( $input )
{
$output = preg_replace(
'/<[^>]*>/e',
"str_replace( '\'', '\"', '$0' )",
$input
);
return $output;
}

So let's say I have this string of HTML code:

On <A href="/home/" target="_self">this</Apage you will find <SPAN
STYLE='font-style: italic'>stuff</SPAN>

Result:
On <A href=\"/home/\" target=\"_self\">this</Apage you will find <SPAN
STYLE="font-style: italic">stuff</SPAN>
Quoted verbatim from the preg_replace manual section:

When using the e modifier, this function escapes some characters
(namely ', ", \ and NULL) in the strings that replace the
backreferences. This is done to ensure that no syntax errors arise
from backreference usage with either single or double quotes (e.g.
'strlen(\'$1\')+strlen("$2")'). Make sure you are aware of PHP's
string syntax to know exactly how the interpreted string will look
like.

Seems a stripslashes to finish up is what you need.
Regards,

--
Schraalhans Keukenmeester - sc*********@the.spamtrapexample.nl
[Remove the lowercase part of Spamtrap to send me a message]
"strcmp('apples','oranges') is -1"

May 28 '07 #2

P: n/a
You could try something like:

"strtr('$0', array('\\\"' ='\"', '\'' ='\"'))"

instead. That is known behavior of the /e modifier...

On May 28, 2:18 am, "amygdala" <nore...@noreply.comwrote:
Hi there,

I'm trying to replace single quoted attributes in HTML tags with double
quotes. What I've come up with is this:

function replaceSingleQuotesInsideTags( $input )
{
$output = preg_replace(
'/<[^>]*>/e',
"str_replace( '\'', '\"', '$0' )",
$input
);
return $output;

}

So let's say I have this string of HTML code:

On <A href="/home/" target="_self">this</Apage you will find <SPAN
STYLE='font-style: italic'>stuff</SPAN>

Result:
On <A href=\"/home/\" target=\"_self\">this</Apage you will find <SPAN
STYLE="font-style: italic">stuff</SPAN>

As you can see, when I run it through my function
replaceSingleQuotesInsideTags, not only does it replace the single quotes
with double quotes, but it also adds backslashes before double quotes that
were already present. This is unexpected behaviour to me.

Expected result:
On <A href="/home/" target="_self">this</Apage you will find <SPAN
STYLE="font-style: italic">stuff</SPAN>

Note the missing backslashes in the anchor tag attributes.

Does anybody have an idea of what is going on here?

Working with PHP 5.1.4, magic_quotes (all) off.

Thank you in advance.

May 28 '07 #3

P: n/a

"amygdala" <no*****@noreply.comschreef in bericht
news:46***********************@news.kpnplanet.nl.. .
Hi there,

I'm trying to replace single quoted attributes in HTML tags with double
quotes. What I've come up with is this:

function replaceSingleQuotesInsideTags( $input )
{
$output = preg_replace(
'/<[^>]*>/e',
"str_replace( '\'', '\"', '$0' )",
$input
);
return $output;
}

So let's say I have this string of HTML code:

On <A href="/home/" target="_self">this</Apage you will find <SPAN
STYLE='font-style: italic'>stuff</SPAN>

Result:
On <A href=\"/home/\" target=\"_self\">this</Apage you will find <SPAN
STYLE="font-style: italic">stuff</SPAN>

As you can see, when I run it through my function
replaceSingleQuotesInsideTags, not only does it replace the single quotes
with double quotes, but it also adds backslashes before double quotes that
were already present. This is unexpected behaviour to me.

Expected result:
On <A href="/home/" target="_self">this</Apage you will find <SPAN
STYLE="font-style: italic">stuff</SPAN>

Note the missing backslashes in the anchor tag attributes.

Does anybody have an idea of what is going on here?

Working with PHP 5.1.4, magic_quotes (all) off.

Thank you in advance.
Aaah yes, I should have rtfm. My bad. Thanks people.
May 28 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.