I figured it out already.

if the array has

http://example.com/bbs/index.php?board=1
http://example.com/bbs/index.php?board=1;action=display;thread=12
3

then, the str_replace of that one with the other one that has the
symbols changed, will be
http://example.com/bbs/index.php/board-1

but it'll ALSO change the other one!
http://example.com/bbs/index.php/board-1;action=display;thread=12
3

so when str_replace is looking for a match for the second url, it
doesn't find it, cause it's not the same anymore

I added this, right before the for loop, so larger strings will
be replaced first and shorter last.
   rsort($match_spider, SORT_STRING);

Thanks for "listening" to me while I was trying to figure it out
anyway :)

Cristian


Anguz Web Design wrote:
> Hi,
>
> I wrote a code to change the urls in my forum, to a new format.
I
> did it with output buffering and inside it, I used
> preg_replace_callback, which worked great for me. But I shared
> this code with the forum program community and there's a person
> that can't make it work. He says his Apache gets caught up in a
> loop or something. So I looked for an alternative to
> preg_replace_callback. The way I did it is with preg_match_all
> and then changed each element in the array and saved the
changed
> elements in a new array, then I just str_replace using the
arrays
> as find/replace. This solutions worked fine, almost. I use two
> functions to do changes to the urls, one to make them relative
> and the other to change symbols in the query, to something more
> friendly to search-engine spiders. The function to make them
> relative works great with the new method, as it did with
> preg_replace_callback, but the other function, the one to
replace
> symbols in the query, is acting in an odd way.
>
> Here's function
>
> <?php
>    function spider_url($match){
>       if(!strstr($match['2'], 'action') || strstr($match['2'],
> 'display') || strstr($match['2'], 'messageindex'))
>          return $match['1'] . '/' . str_replace(array("=", ";",
> "&"), array("-", "_", "_"), $match['2']);
>       return $match['0'];
>    }
>>
>
> if I call it with this
>
> <?php
>    /// $scripturl is the var that has the url to the forum
> script, like http://example.com/bbs/index.php
>    $buffer = preg_replace_callback('/(' .
preg_quote($scripturl,
> '/') . ')\?([\w;=~&+%]+)/i', 'spider_url', $buffer);
>>
>
> it works great and the url
>
>
http://example.com/bbs/index.php?board=1;action=display;thread=12
> 3;start=1
>
> changes to
>
>
http://example.com/bbs/index.php/board-1_action-display_thread-12
> 3_start-1
>
> but if I do it with this
>
> <?php
>    preg_match_all('/(' . preg_quote($scripturl, '/') .
> ')\?([\w;=~&+%]+)/i', $buffer, $match_spider, PREG_SET_ORDER);
>    for($i = 0; $i < count($match_spider); $i++){
>       $arr1_spider[$i] = $match_spider[$i]['0'];
>       $arr2_spider[$i] = spider_url($match_spider[$i]);
>    }
>    $buffer = str_replace($arr1_spider, $arr2_spider, $buffer);
>>
>
> then the url comes out like this
>
>
http://example.com/bbs/index.php/board-1;action=display;thread=12
> 3;start=1
>
> It changes just the first part, up to the semicolon... I did
> other tests and there was one where changed everything up to
the
> semicolon right before 'star'....
>
> I can't understand what's going on, so if someone has a clue,
> please tell me. Thank you very much in advance for taking your
> time reading this.
>
> Cristian

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to