PHP preg_replace问题

时间:2011-05-12 17:09:02

标签: php regex url

这是一个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// 中的值。

我错过了什么?

谢谢!

4 个答案:

答案 0 :(得分:1)

嗯,很奇怪。

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

但是我用正则表达式修复了2件事:

  1. 不要使用|作为分隔符,它在正则表达式中有意义。
  2. 你的正则表达式只是给人一种假象,即你没有逃避.。它实际上也匹配http://www#mysite%com/script*php?fruit=apple
  3. 测试脚本:

    $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”]