Проблема PHP preg_replace - PullRequest
       1

Проблема PHP preg_replace

3 голосов
/ 12 мая 2011

Это дополнительный вопрос к вопросу , который я разместил здесь (спасибо mario )

Хорошо, поэтому у меня есть выражение preg_replace для заменыстрока URL с sometext, вставьте значение из строки запроса (используя $_GET["size"]) и вставьте значение из ассоциативного массива (используя $fruitArray["$1"] обратная ссылка.)

Входная строка URL будет:

http://mysite.com/script.php?fruit=apple

Выходная строка должна быть:

http://mysite.com/small/sometext/green/

У меня есть следующий PHP:

$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);

Этот код выводит следующую строку:

 http://mysite.com/small/sometext//

Код, похоже, пропускает значение в $fruitArray["$1"].

Что мне не хватает?

Спасибо!

Ответы [ 4 ]

1 голос
/ 12 мая 2011

я пишу это снова, я не понимаю, где ошибка, оценка результатов preg очень странная в php

preg_replace(
    '|http\://([\w\.-]+?)/script\.php\?fruit=([\w_-]+)|e'
    , '"http://www.$1/".$_GET["size"]."/sometext/".$fruitArray["$2"]."/";'
    , $result
);
1 голос
/ 12 мая 2011

Ну, странная вещь.

Ваш код отлично работает для меня (см. Код, который я использовал для локального тестирования).

Однако я исправил 2 вещи с вашим регулярным выражением:

  1. Не использовать |как разделитель, он имеет значение в регулярном выражении.
  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);
0 голосов
/ 12 мая 2011

$ fruitArray ["\ $ 1"] вместо $ fruitArray ["$ 1"]

0 голосов
/ 12 мая 2011

Похоже, вы забыли сбежать от ?.Это должно быть /script.php\?, с \? для правильного выхода, как в ответе, который вы предоставили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...