preg_replace无法正确匹配

时间:2012-02-25 21:46:27

标签: php regex preg-replace

我知道之前已经问过这个问题,因为我刚刚阅读了这些答案,但仍然无法正常工作(正确)。

我是正则表达式的新手,我正在尝试做一些听起来非常简单的事情:

字符串将是: http://www.something.com/section/filter/colour/red-#998682/size/small/

我想做的是preg_replace删除 - #??????所以网址看起来像: http://www.something.com/section/filter/colour/red/size/small/

所以我试过了:

$string = $theURL;
$pattern = '/-\#(.*)\//i';
$replacement = '/';
$newURL = preg_replace($pattern, $replacement, $string);

这种作品但它并没有停止。如果我之后有什么 - #??????它也删除了它。但我觉得有/最终会阻止它这样做吗?

希望有人可以提供帮助并感谢您的阅读

3 个答案:

答案 0 :(得分:1)

默认情况下,PCRE是贪婪的,这意味着.*将匹配尽可能大的块。通过添加U标志(针对整个模式)或使用.*?(仅针对该通配符部分)来使其不合适:

/-\#(.*)\//iU

/-\#(.*?)\//i

答案 1 :(得分:1)

你需要使用非贪婪的量词。

$pattern = '/-\#(.*?)\//i';

你的正则表达式是贪婪的,这意味着(.*)\/寻找最后一个斜杠,而不是第一个斜杠。

demo

答案 2 :(得分:1)

(.*)模式是gready,这意味着它将匹配尽可能多的字符。要将所有内容与第一个斜杠相匹配,请使用(.*?)

$pattern = '/-\#(.*?)\//i';