PHP preg_replace没有按预期工作

时间:2013-12-28 16:49:28

标签: php regex

我正在尝试从以下两个字符串中替换 / admin \ admin

F:\dev\htdocs\cms\admin
http://localhost/cms/admin 

preg_replace 中使用以下正则表达式:

/[\/\\][a-zA-Z0-9_-]*$/i

1)从第一个字符串中取代 admin ,因为它应该替换 \ admin

2)从第二个字符串中取代除 http:之外的所有内容,因为它只能替换 / admin

我在http://regexpal.com/上检查了这个表达式,它在那里工作得很完美,但在PHP中却没有。

有什么想法吗?

  

请注意,每个字符串 admin 的最后一部分都不是固定的,它可以   是任何用户选择的值,这就是我使用[a-zA-Z0-9 _-] *的原因   正则表达式。

2 个答案:

答案 0 :(得分:6)

原始正则表达式应为/[\/\\][a-zA-Z0-9_-]*$/i,但由于您需要在字符串声明中转义反斜杠,因此每个反斜杠必须用\\表示 - 总共有4个反斜杠。

来自PHP manual

  

单引号和双引号PHP字符串具有反斜杠的特殊含义。因此,如果\必须与正则表达式\\匹配,则必须在PHP代码中使用"\\\\"'\\\\'

因此,您的preg_replace()语句应如下所示:

echo preg_replace('/[\/\\\\][a-zA-Z0-9_-]*$/i', '', $str);

您的正则表达式可以改进如下:

echo preg_replace('~[/\\\\][\w-]*$~', '', $str);

此处,\w与ASCII字符[A-Za-z0-9_]匹配。您还可以使用不同的分隔符来避免转义正斜杠/ - 我上面使用了~

答案 1 :(得分:0)

[\/\\\][a-zA-Z0-9_-]*$/i

Live demo