2011-05-12 102 views
3

这是一个后续问题的一个I posted here(感谢marioPHP的preg_replace问题

好了,我有一个的preg_replace语句sometext替换URL字符串,从查询字符串插入值(使用$_GET["size"])和插入来自关联数组的值(使用$fruitArray["$1"]回参考)

输入URL字符串将是:

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

我错过了什么?

谢谢!

+1

当问这样一个问题,你应该完全删除$ _GET和$ fruitArray并使用常量来将问题本地化到preg_replace。也许你的变量是空的,我们无法确定它 – 2011-05-12 17:23:57

+0

@Riccardo Galli你在那里是非常正确的,经验教训 - 必须停止在fag数据包的背面写入php并移动到PHP IDE - 你有什么建议吗? ?我是一个新手:/干杯。 – Matt 2011-05-12 19:23:18

+0

通过重写一些前面的代码来解决这个问题;我有其他的preg_replace调用干扰的URL字符串:/也许我的代码上面是半 - OK :-)这个项目开始很小,但现在它的数百和​​数百行代码 - 对所有的道歉 - 我很欣赏答案,欢呼! – Matt 2011-05-12 19:28:59

回答

1

好了,奇怪的事情。

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

,但我却解决两件事情与你的正则表达式:

  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 ;-)这也是一个更清洁,阅读,国际海事组织。

$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); 
+0

感谢您的详细解答并指出了更好的方法。非常感谢。我要去preg_replace_callback,对我来说是新的东西,欢呼:) – Matt 2011-05-12 19:34:48

+0

没问题!很高兴我能帮上忙,听说这不是你发布的这个代码,因为它让我感到困惑,它会适用于我而不是你;-) – 2011-05-12 19:40:09

0

看起来你已经忘记逃离?。它应该是/script.php\?,并且\?可以正确地转义,就像你提供的链接答案一样。

+0

哎呀,我只是在这里发布的例子中忘了这么做;实际的代码被正确转义。代码更新,谢谢指出 - 问题依然存在。 – Matt 2011-05-12 17:17:50

0

$ fruitArray [ “\ $ 1”]而不是$ fruitArray [ “$ 1”]

1

我再写一遍,我不明白好哪里是错误的预浸结果的评价是在PHP非常怪异

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

感谢你的努力,我现在设法解决了这个问题。正则表达式非常强大,但很难掌握:/干杯! – Matt 2011-05-12 19:31:09

+0

@Matt正则表达式就像你说的那样强大,但是即使你写了它,有时也很难被人类读取,并且是一个很好的练习。 正则表达式只是练习......保持这样的正则表达式问题总是一个漂亮的问题。 – 2011-05-12 20:35:59