PHP preg_replace problem


PHP preg_replace problem

这是我在这里发布的问题的后续问题(感谢马里奥)

好的,所以我有一个preg_replace语句来用 sometext 替换 url 字符串,插入查询字符串中的值(使用 $_GET["size"] )并从关联数组中插入值(使用$fruitArray["$1"]反向引用)。

输入网址字符串为:

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"] 中的值。

我错过了什么?

谢谢!

嗯,奇怪的事情。

你的代码工作对我来说非常好(请参阅下面我用于本地测试的代码)。

但是,我确实使用您的正则表达式修复了 2 件事:

  1. 不要使用 | 作为分隔符,它在正则表达式中有意义。
  2. 你的正则表达式只是给人一种错觉,认为它有效,因为你没有逃脱.。它实际上也匹配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 修饰符让 PHP 在内部调用evil()函数更有意义;-)读起来也干净多了,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);

我再写一遍,我不明白哪里有错误,在php中对preg结果的评估很奇怪

preg_replace(
    '|http'://(['w'.-]+?)/script'.php'?fruit=(['w_-]+)|e'
    , '"http://www.$1/".$_GET["size"]."/sometext/".$fruitArray["$2"]."/";'
    , $result
);

看来你忘了逃?. 它应该是 /script.php'? ,带有正确转义的'?,就像您提供的链接答案一样。

$fruitArray["''$1"] 而不是 $fruitArray["$1"]