【问题标题】:PHP preg_replace problemPHP preg_replace 问题
【发布时间】:2011-08-24 07:34:21
【问题描述】:

这是I posted here 的后续问题(感谢mario

好的,所以我有一个 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"] 中的值。

我错过了什么?

谢谢!

【问题讨论】:

  • 当问这样的问题时,您应该完全删除 $_GET 和 $fruitArray 并改用常量,将问题仅定位到 preg_replace。可能你的变量是空的,我们不能确定
  • @Riccardo Galli 你说得很对,吸取的教训 - 必须停止在 fag 数据包的背面编写 php 并转移到 PHP IDE - 你有什么建议吗?我真是个菜鸟:/干杯。
  • 设法通过重写一些前面的代码来解决这个问题;我有其他 preg_replace 调用干扰了 url 字符串:/ 也许我上面的代码毕竟是半好的 :-) 这个项目开始时很小,但现在它有数百行代码 - 向所有人道歉 - 我很感激答案,干杯!

标签: php regex url


【解决方案1】:

嗯,奇怪的事情。

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

我确实用你的正则表达式修复了两件事:

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

【讨论】:

  • 感谢您的详细回答并指出更好的方法;值得赞赏。我要去 preg_replace_callback 试一试,对我来说是新的东西,干杯:)
  • 没问题!很高兴我能帮上忙,听到你发布的不是这段代码也让我松了一口气,因为这让我感到困惑,它对我有用,而不是你;-)
【解决方案2】:

又写了一遍,不明白错在哪里,php中preg结果的评价很诡异

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

【讨论】:

  • 感谢您的努力,不过我现在设法解决了这个问题。正则表达式是如此强大但又如此难以掌握:/ 干杯!
  • @Matt 正则表达式正如您所说的那样强大,但有时即使您编写它也很难被人类阅读,并且再次编写它是一个好习惯。正则表达式只是练习......保持这种方式正则表达式问题总是一个漂亮的问题。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您似乎忘记了转义?。它应该是/script.php\?,带有\? 以正确转义,如您提供的链接答案中所示。

    【讨论】:

    • 哎呀,我只是忘记在此处发布的示例中这样做了;实际代码已正确转义。代码已更新,感谢您指出 - 问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多