用preg_replace替换字符串

时间:2012-05-08 12:40:02

标签: php regex preg-replace

我有这样的网址:

http://Example.com/mobile-ds-cams/mobile-gg-cams/ddd-webcams

示例:

$pattern = '/http://Example.com/(\w+)/(\w+)/(\w+)/i';               
$replacement="http://Example.com/$2/$3";
$appUrl= preg_replace($pattern, $replacement, $appUrl);

我想要实现的是这个

http://Example.com/mobile-gg-cams/ddd-webcams

我试图保留2个“子网址”而不是3.但它不起作用..为什么?

3 个答案:

答案 0 :(得分:3)

您需要在模式中转义正斜杠,或使用不同的模式分隔符。

$pattern = '/http:\/\/Example\.com\/(\w+)\/(\w+)\/(\w+)/i';               

$pattern = '#http://Example\.com/(\w+)/(\w+)/(\w+)#i';               

答案 1 :(得分:0)

逃避这样的斜杠:

$pattern = '/http:\/\/Example.com\/(\w+)\/(\w+)\/(\w+)/i';               
$replacement="http://Example.com/$2/$3";
$appUrl= preg_replace($pattern, $replacement, $appUrl);

答案 2 :(得分:0)

它无法正常工作,因为您的表达式包含未正确引用的正则表达式中具有特殊含义的字符。

要100%确定,请使用preg_quote,如下所示:

$url = 'http://Example.com/'
$pattern = preg_quote($url.'{word}/{word}/{word}', '/');
$pattern = str_replace($pattern, '{word}', '(\w+)');
$pattern = "/$pattern/i";
$replacement = $url.'$2/$3';
$appUrl= preg_replace($pattern, $replacement, $appUrl);

否则,错误太容易了。例如,当前发布的其他答案的所有都会错误,因为它们没有正确地逃脱{在.中{1}}。你可以自己测试一下,如果你喂他们一个字符串,例如Example.com,其中http://Example!com可以是您喜欢的任何角色。

此外,你在双引号字符串文字中使用!之类的字符串,这在PHP中不是一个好主意,因为恕我直言,它很容易被带走。最好单独引用并安全。