Ну, странная вещь.
Ваш код отлично работает для меня (см. Код, который я использовал для локального тестирования).
Однако я исправил 2 вещи с вашим регулярным выражением:
- Не использовать |как разделитель, он имеет значение в регулярном выражении.
- Ваше регулярное выражение только создает иллюзию того, что оно работает, поскольку вы не избегаете
.
s.На самом деле это тоже соответствует http://www#mysite%com/script*php?fruit=apple
.
Тестовый скрипт:
$fruitArray = array('apple' => 'green');
$_GET = array('size' => 'small');
$result = 'http://www.mysite.com/script.php?fruit=apple';
$result = preg_replace('@http://www\.mysite\.com/script\.php\?fruit=([a-zA-Z0-9_-]*)@e', ' "http://www.mysite.com/" .$_GET["size"]. "/sometext/" .$fruitArray["$1"]. "/"', $result);
echo $result;
Вывод:
Rudis-Mac-Pro:~ rudi$ php tmp.php
http://www.mysite.com/small/sometext/green/
Единственное, что заставляет меня думать эточто $fruitArray
настроен неправильно для вас.
Кстати, я думаю, что это может быть более уместным, так как это даст вам большую гибкость в будущем, улучшенную подсветку синтаксиса и больше смыслачем использование модификатора e
для функции evil()
, вызываемой изнутри PHP ;-) Это также намного чище, IMO.
$result = preg_replace_callback('@http://www\.mysite\.com/script\.php\?fruit=([a-zA-Z0-9_-]*)@', function($matches) {
global $fruitArray;
return 'http://www.mysite.com/' . $_GET['size'] . '/sometext/' . $fruitArray[$matches[1]] . '/';
}, $result);