Double backslashes \\ in strings

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

    Double backslashes \\ in strings

    I have a function textag($express ion){...}
    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 )
  • Erwin Moller

    #2
    Re: Double backslashes \\ in strings


    JohnF schreef:
    I have a function textag($express ion){...}
    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. ;-)

    Read up here:


    Regards,
    Erwin Moller

    --
    =============== =============
    Erwin Moller
    Now dropping all postings from googlegroups.
    Why? http://improve-usenet.org/
    =============== =============

    Comment

    • JohnF

      #3
      Re: Double backslashes \\ in strings

      Erwin Moller < wrote:
      JohnF schreef:
      >I have a function textag($express ion){...}
      >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. ;-)
      Read up here:

      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

      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 )

      Comment

      • Michael Fesser

        #4
        Re: Double backslashes \\ in strings

        ..oO(JohnF)
        >The examples on

        >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

        Comment

        • JohnF

          #5
          Re: Double backslashes \\ in strings

          Michael Fesser <netizen@gmx.de wrote:
          .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

          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 )

          Comment

          • Erwin Moller

            #6
            Re: Double backslashes \\ in strings


            JohnF schreef:
            Erwin Moller < wrote:
            >JohnF schreef:
            >>I have a function textag($express ion){...}
            >>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. ;-)
            >Read up here:
            >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
            headache. ;-)
            The examples on

            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_gp c.

            Regards,
            Erwin Moller

            --
            =============== =============
            Erwin Moller
            Now dropping all postings from googlegroups.
            Why? http://improve-usenet.org/
            =============== =============

            Comment

            • JohnF

              #7
              Re: Double backslashes \\ in strings

              Erwin Moller < wrote:
              JohnF schreef:
              >Erwin Moller < wrote:
              >>JohnF schreef:
              >>>I have a function textag($express ion){...}
              >>>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
              >>>interprete d 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. ;-)
              >>Read up here:
              >>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 )

              Comment

              • Erwin Moller

                #8
                Re: Double backslashes \\ in strings


                JohnF schreef:
                Erwin Moller < wrote:
                >JohnF schreef:
                >>Erwin Moller < wrote:
                >>>JohnF schreef:
                >>>>I have a function textag($express ion){...}
                >>>>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
                >>>>expressio n argument in single quotes, then that
                >>>>works fine, and the single backslash isn't
                >>>>interpret ed 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. ;-)
                >>>Read up here:
                >>>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 read my response?
                Did you follow and read the links I sent you?
                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.

                Please reread my last posting and make sure you understand everything.

                Regards,
                Erwin Moller



                --
                =============== =============
                Erwin Moller
                Now dropping all postings from googlegroups.
                Why? http://improve-usenet.org/
                =============== =============

                Comment

                Working...