这是一个I posted here的后续问题(感谢mario)
好的,所以我有一个preg_replace语句来用sometext
替换url字符串,从查询字符串中插入一个值(使用$_GET["size"]
)并从关联数组中插入一个值(使用{{ 1}}后退参考。)
输入网址字符串为:
$fruitArray["$1"]
输出字符串应为:
http://mysite.com/script.php?fruit=apple
我的PHP如下:
http://mysite.com/small/sometext/green/
此代码输出以下字符串:
$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//
中的值。
我错过了什么?
谢谢!
答案 0 :(得分: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
修饰符更适合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);
答案 1 :(得分:1)
我再写一遍,我不明白哪里有错误,preg结果的评价在php中非常奇怪
preg_replace(
'|http\://([\w\.-]+?)/script\.php\?fruit=([\w_-]+)|e'
, '"http://www.$1/".$_GET["size"]."/sometext/".$fruitArray["$2"]."/";'
, $result
);
答案 2 :(得分:0)
看起来你忘了逃避?
。它应该是/script.php\?
,\?
可以正常转义,就像您提供的链接答案一样。
答案 3 :(得分:0)
$ fruitArray [“\ $ 1”]而不是$ fruitArray [“$ 1”]