这是我在这里发布的问题的后续问题(感谢马里奥)
好的,所以我有一个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 件事:
- 不要使用 | 作为分隔符,它在正则表达式中有意义。
- 你的正则表达式只是给人一种错觉,认为它有效,因为你没有逃脱
.
。它实际上也匹配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"]