26 replies
Hopefully this might just be a few lines of code
and if so I would be grateful if someone could supply.
(My head is spinning with ereg pattern matching)


The requirement:

--------------------------------------------------------
I have a string which can contain any number of 'tokens'.
A token is text enclosed by {}

So for example

==> Hello {abc}, goodbye {def}

I want to remove the {} and replace each token
with a string derived from the token.

So I end up with

==> Hello xxx, goodbye yyy

where xxx = function (abc)
yyy = function (def)
--------------------------------------------------------

Thanks
Harvey
#code #php
  • Profile picture of the author jaggyjay
    Hey Harvey,

    My php skills are still towards the "newbie" side.

    But... you can post this prob on tek-tips.com. It's my
    secret weapon whenever I have a coding question.
    You should get an answer within a day or so.

    Hope this helps.

    Best,
    -Jay
    {{ DiscussionBoard.errors[273587].message }}
    • Profile picture of the author Neil Morgan
      Hi Harvey

      I did put some thought into this but it's not the easiest thing to do. I guess that's why you've not had a working reply yet.

      The parsing of the original string to pull out all the tokens between the { and } symbols is the tricky bit because there's no one function that will do it.

      It would need a function written to look for each { then read to the } to build the token, process and replace it (the easy part) and continue until all tokens had been read.

      It's not that difficult, just a bit of a pain.

      But I guess you already knew all that

      Cheers,

      Neil
      Signature

      Easy email marketing automation without moving your lists.

      {{ DiscussionBoard.errors[273602].message }}
      • Profile picture of the author Harvey Segal
        Originally Posted by jaggyjay View Post

        But... you can post this prob on tek-tips.com.
        Thanks Jay. I'll try them if I don't get an answer here.

        Originally Posted by samstephens View Post

        = str_replace("{abc}", "Harvey", );
        = str_replace("{def}", "Sam", );
        Sam,

        The problem is that abc, def etc are not known in advance

        Originally Posted by Neil Morgan View Post

        The parsing of the original string to pull out all the tokens between the { and } symbols is the tricky bit because there's no one function that will do it.
        Neil

        Would it help to do it this way

        1. Read through the string, extracting tokens into an array (along with
        the corresponding replacement value). This will also give you the
        number of tokens (n).

        2. Loop n times through the string replacing each token in turn

        Harvey
        {{ DiscussionBoard.errors[274266].message }}
        • Profile picture of the author Tom B
          Banned
          Harvey, I am not a PHP coder but do know other programming languages.

          If you look at Sam's, you can change the Harvey and Sam to variables on the page. That would give you the runtime names instead of Harvey and Sam.


          Does that make sense?
          {{ DiscussionBoard.errors[276969].message }}
          • Profile picture of the author Harvey Segal
            Originally Posted by Thomas Belknap View Post

            Harvey, I am not a PHP coder but do know other programming languages.

            If you look at Sam's, you can change the Harvey and Sam to variables on the page. That would give you the runtime names instead of Harvey and Sam.


            Does that make sense?
            Thanks Thomas but it still does not help

            The problem, as mentioned, is that abc, def etc are not known in advance

            Harvey
            {{ DiscussionBoard.errors[277009].message }}
            • Profile picture of the author Tom B
              Banned
              Originally Posted by Harvey.Segal View Post

              Thanks Thomas but it still does not help

              The problem, as mentioned, is that abc, def etc are not known in advance

              Harvey

              Exactly, the variables can be from a database or from something the person entered into a form. The information must have been sent if you want to use it. You just plug that information into what Sam wrote. This is done when the website is running.


              For example.

              A person can enter in a number between 1 and 10.

              I don't know what they will enter in, I just know that there will be a number in a form field called num.


              So I take Sam's code and do something like this.
              = str_replace("{abc}", num, ); <--- you see I inserted num there.


              If you don't know the values when the script runs then it will never work.
              {{ DiscussionBoard.errors[277011].message }}
            • Profile picture of the author Harvey Segal
              Amazing

              I've got the answer from tek-tips.com

              Basically one command can do it


              ================================================== ==========
              $s='Hello {abc}, goodbye {def}';

              echo preg_replace_callback('/\{([^{}]+)\}/',whatever,$s);

              function whatever($what)
              {
              return strtoupper($what[1]);
              }
              ================================================== ==========
              {{ DiscussionBoard.errors[277013].message }}
              • Profile picture of the author Harvey Segal
                Originally Posted by Thomas Belknap View Post

                So I take Sam's code and do something like this.
                = str_replace("{abc}", num, ); <--- you see I inserted num there.
                But where did you get abc from ?

                Harvey
                {{ DiscussionBoard.errors[277021].message }}
                • Profile picture of the author Tom B
                  Banned
                  Originally Posted by Harvey.Segal View Post

                  But where did you get abc from ?

                  Harvey
                  You tell me. lol

                  From the url string, if that is what you meant in the OP. If you have more than one token with the url then you wouldn't be able to use Sam's idea.
                  {{ DiscussionBoard.errors[277091].message }}
                  • Profile picture of the author Harvey Segal
                    Originally Posted by Thomas Belknap View Post

                    You tell me. lol

                    From the url string, if that is what you meant in the OP. If you have more than one token with the url then you wouldn't be able to use Sam's idea.
                    But the value abc is unknown beforehand
                    So you cannot have code which mentions it
                    e.g

                    str_replace("{abc}", num, )

                    Now if you are saying that abc should be replaced by a variable
                    and instead of one str_replace command we should loop through
                    the string then that is exactly the problem I am trying to solve.

                    However just after you posted I found the solution above.

                    Harvey
                    {{ DiscussionBoard.errors[277107].message }}
  • Profile picture of the author samstephens
    I'd just do it using the string replace function:

    $rawString = "Hello {abc}, goodbye {def}";

    $newString = str_replace("{abc}", "Harvey", $rawString);
    $newString = str_replace("{def}", "Sam", $newString);

    echo $newString;


    ....gives you:

    Hello Harvey, goodbye Sam


    Quick and easy, just the way I like my code

    cheers
    Sam
    Signature
    DLGuard v5 - The Warrior Edition
    Full integration with JVZoo, DigiResults, and WSO Pro for secure WSO's and WSO memberships.

    www.dlguard.com
    Serving the Warrior Forum since 2004
    {{ DiscussionBoard.errors[273694].message }}
  • Profile picture of the author ofir
    Banned
    Learn regular expressions.

    And then you will be able to replace patterns , such as "{XXXXXX}".
    {{ DiscussionBoard.errors[274419].message }}
    • Profile picture of the author Harvey Segal
      Originally Posted by ofir View Post

      Learn regular expressions.

      And then you will be able to replace patterns , such as "{XXXXXX}".
      That's actually the easy part of the problem.
      {{ DiscussionBoard.errors[274430].message }}
  • Profile picture of the author drewjones
    Banned
    Is this for a membership site login and logout???

    What I do to learn these kinda things is by studying code from the CMS programs (wordpress,joomla, etc.)

    Then I implement it.

    Hope this helps...
    {{ DiscussionBoard.errors[275037].message }}
    • Profile picture of the author Harvey Segal
      Originally Posted by drewjones View Post

      Is this for a membership site login and logout???
      No it's not


      Originally Posted by drewjones View Post

      What I do to learn these kinda things is by studying code from the CMS programs (wordpress,joomla, etc.)

      Then I implement it.
      Well I could spend hours searching and studying OR ask an expert
      at the Warrior forum !

      Harvey
      {{ DiscussionBoard.errors[275051].message }}
  • Profile picture of the author drewjones
    Banned
    Then what is the primary purpose...???

    I spend the hours it takes to learn the simplest things....

    I don't rely on others information...
    {{ DiscussionBoard.errors[275060].message }}
    • Profile picture of the author Harvey Segal
      Originally Posted by drewjones View Post

      Then what is the primary purpose...???
      Well - not that it matters - but it's an addition to
      software which I have had developed for me

      Originally Posted by drewjones View Post

      I spend the hours it takes to learn the simplest things....

      I don't rely on others information...
      But I'm not planning to become a software developer
      and won't need to use this information again.

      The hours lost in getting this solution could
      be put to better use. Agree ?


      Harvey
      {{ DiscussionBoard.errors[275072].message }}
  • Profile picture of the author drewjones
    Banned
    Agreed...

    take a look at this....

    PHP: strtok - Manual
    {{ DiscussionBoard.errors[275081].message }}
  • Profile picture of the author n2links
    I stole this from some open source code. It may give you and idea of how to proceed.

    function fill($template, $values) {

    if (sizeof($values) != 0) {
    // go through all the values
    for(reset($values); $key = key($values); next($values)) {
    $template = str_replace("{$key}",$values[$key],$template);
    }
    }

    // remove non matched template-tags
    return preg_replace('/{[a-zA-Z]+}/','',$template);
    }
    {{ DiscussionBoard.errors[276223].message }}
    • Profile picture of the author Harvey Segal
      Originally Posted by n2links View Post

      I stole this from some open source code. It may give you and idea of how to proceed.

      function fill(, ) {

      if (sizeof() != 0) {
      // go through all the values
      for(reset(); = key(); next()) {
      = str_replace("",,);
      }
      }

      // remove non matched template-tags
      return preg_replace('/{[a-zA-Z]+}/','',);
      }
      Jim

      Thank you for that.

      I only know php basics so that's too difficult for me
      to follow but someone else reading this thread
      might be able to use it


      Harvey
      {{ DiscussionBoard.errors[276898].message }}
    • Profile picture of the author andr102
      Originally Posted by n2links View Post

      I stole this from some open source code. It may give you and idea of how to proceed.

      function fill(, ) {

      if (sizeof() != 0) {
      // go through all the values
      for(reset(); = key(); next()) {
      = str_replace("",,);
      }
      }

      // remove non matched template-tags
      return preg_replace('/{[a-zA-Z]+}/','',);
      }
      Thanks! It helps! I think soon I'll become so good programmer!!
      {{ DiscussionBoard.errors[282393].message }}
  • Profile picture of the author rwil02
    OK. Not a PHP programmer, but I can manage.
    Here is the code stolen from above.
    ===========================
    $s='Hello {abc}, goodbye {def}';

    echo preg_replace_callback('/\{([^{}]+)\}/',whatever,$s);

    function whatever($what)
    {
    return strtoupper($what[1]);
    }

    ==============================

    Wht's happening:

    preg_replace_callback = the first funny string basically says match everything in {} that is not a curly bracket that gets your ABC or DEF

    whatever is the name of a function

    $s is the string you are looking through "Hello {abc}, goodbye {def}" in the example

    So in the function "whatever" this code returns the uppercase version of the string that was matched (abc or def converts to ABC or DEF)

    so you would replace the functionality in there with something like

    $lookup = strtoupper($what[1]); //Assumes you want a case insensitive lookup
    //Use $lookup to find the value you want, such as using a map variable or looking the value up in the DB (which would be very slow if you do it repeatedly).


    ===========================
    $s='Hello {abc}, goodbye {def}';

    echo preg_replace_callback('/\{([^{}]+)\}/',replace_token_with,$s);

    function replace_token_with($what)
    {
    $lookup = strtoupper($what[1]);
    return get_value_of($lookup);
    }

    ==============================
    Signature

    Roger Willcocks
    L-Space Design
    Please vote to help me win a 3kW solar array

    {{ DiscussionBoard.errors[282810].message }}
    • Profile picture of the author Harvey Segal
      Originally Posted by rwil02 View Post

      //Use to find the value you want, such as using a map variable or looking the value up in the DB (which would be very slow if you do it repeatedly).
      Thanks Roger, though I have now adapted and implemented the code
      in my program.

      If you are interested to know what it was for it was to
      allow cloaked links in a PDF rebranding tool.

      I need to change { { url } } to decodeurlscript.php?u = url
      throughout a page of HTML.

      You can see it in action here

      Try the Demo (Item 3) at
      Login


      Harvey
      {{ DiscussionBoard.errors[283050].message }}
  • Profile picture of the author rwil02
    Needs a login
    So you have wanted something like

    function replace_token_with($what)
    {

    return "http://www.example.com/decodeurlscript.php?u=" + urlencode($what[1]);
    }

    I've never found doing in place substitutions inside PDF files to work well, especially since it requires uncompressed PDFs.

    How do you do it? Just a simple replace, or modify a base (eg postscript) fiel and generate from that?
    Signature

    Roger Willcocks
    L-Space Design
    Please vote to help me win a 3kW solar array

    {{ DiscussionBoard.errors[283091].message }}
    • Profile picture of the author Harvey Segal
      Originally Posted by rwil02 View Post

      Needs a login
      Login as a NEW affiliate

      Originally Posted by rwil02 View Post

      So you have wanted something like

      function replace_token_with()
      {

      return "http://www.example.com/decodeurlscript.php?u=" + urlencode();
      }
      That's right

      Originally Posted by rwil02 View Post

      How do you do it? Just a simple replace, or modify a base (eg postscript) fiel and generate from that?
      I modify an HTML file and create the PDF from that
      See
      http://www.ultimaterebrander.com/

      Harvey
      {{ DiscussionBoard.errors[283115].message }}

Trending Topics