[thelist] Complicated PHP Search and Replace

Chris spam at cimmanon.org
Tue Nov 9 16:52:26 CST 2004


On Tue, 9 Nov 2004 16:28:02 GMT, <danieleastwell at onetel.net.uk> wrote:

> I have this psuedo-code so far, that operates on the content
> after having converted the <bullet> tags to conventional
> <ul><li> opening and closing tags (only at the beginning and
> end of an unordered list):
>
> go through $content and for every <ul>, find <li>,  then,
> until you find </li>, find \n and replace with </li>\n<li>
>
> and have given it this structure:
>
> for($i=0 ; $i == strlen($content); $i++){ // all of the content
>         for( ; ;){ // every <ul>
>             if(){ // there is a <li>
>                 for( ;;){ // until there is a </li>
>                     $content = str_replace("\n",
> "</li>\n<li>", $content);
>                 }
>             }
>         }
>     }
>
> The problem comes with the coding. The iteration over the
> content does not seem to work, and I can't get my head round
> the correct way of thinking in order to operate a string
> function on a substring, only from a particular starting
> point/needle.
>

Tip:  try printing debugging code in your loops (such as print $i . '<br  
/>') to determine how often a loop is being performed and which areas are  
actually being processed.  It makes it a lot easier to find where the  
problem is located.

I don't think your way of doing it is particularly efficient, but I don't  
have the time to think up a better method (a solid preg_match would be a  
good choice if you take advantage of the pattern matching, but you're on  
your own because I'm a novice at regular expressions).  So here's a few  
things I see to at least improve your existing code.

Your for loop says "while $i is equal to strlen($content), keep performing  
this set of actions, then increment $i".  The problem is that $i is never  
equal to strlen($content), so it never goes through the loop and never  
gets incremented.  Try $i <= strlen($content).

The other thing I see is that you're only looking for the newline  
character (\n).  When it comes to forms, older Macs will submit a carriage  
return (\r), Unix and I think Mac OS X+ will use (\n), and Windows uses  
both (\r\n).  You don't indicate whether or not this is the raw data  
coming from a form.  If this is the case, try str_replace(array("\n",  
"\r", "\r\n"), "</li>\n<li>", $content);

Just so you know, it's never a good idea to call a function like that in  
the for loop because it calls the function every time it loops.  You'll  
get better performance out of $len = strlen($content); for ($i = 0; $i <=  
$len; $i++) { [...] }

-- 
chris


More information about the thelist mailing list