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