strange behaviour: preg_replace with /e modifier and str_replace

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • amygdala

    strange behaviour: preg_replace with /e modifier and str_replace

    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 replaceSingleQu otesInsideTags( $input )
    {
    $output = preg_replace(
    '/<[^>]*>/e',
    "str_replac e( '\'', '\"', '$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
    replaceSingleQu otesInsideTags, 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.


  • Schraalhans Keukenmeester

    #2
    Re: strange behaviour: preg_replace with /e modifier and str_replace

    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 replaceSingleQu otesInsideTags( $input )
    {
    $output = preg_replace(
    '/<[^>]*>/e',
    "str_replac e( '\'', '\"', '$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 - schraalhans@the .spamtrapexampl e.nl
    [Remove the lowercase part of Spamtrap to send me a message]
    "strcmp('apples ','oranges') is -1"

    Comment

    • petersprc

      #3
      Re: strange behaviour: preg_replace with /e modifier and str_replace

      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...@norepl y.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 replaceSingleQu otesInsideTags( $input )
      {
      $output = preg_replace(
      '/<[^>]*>/e',
      "str_replac e( '\'', '\"', '$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
      replaceSingleQu otesInsideTags, 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.

      Comment

      • amygdala

        #4
        Re: strange behaviour: preg_replace with /e modifier and str_replace


        "amygdala" <noreply@norepl y.comschreef in bericht
        news:465a7469$0 $16940$9a622dc7 @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 replaceSingleQu otesInsideTags( $input )
        {
        $output = preg_replace(
        '/<[^>]*>/e',
        "str_replac e( '\'', '\"', '$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
        replaceSingleQu otesInsideTags, 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.


        Comment

        Working...