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