PHP preg_replace没有按预期工作

asi*_*haq 0 php regex

我试图从以下两个字符串替换/ admin\ admin:

F:\dev\htdocs\cms\admin
http://localhost/cms/admin 
Run Code Online (Sandbox Code Playgroud)

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

/[\/\\][a-zA-Z0-9_-]*$/i
Run Code Online (Sandbox Code Playgroud)

1)从第一个字符串,它只是替换管理员,因为它应该替换\ admin

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

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

任何的想法?

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

Ama*_*ali 6

原始的正则表达式应该是/[\/\\][a-zA-Z0-9_-]*$/i,但由于你需要在字符串声明中转义反斜杠,每个反斜杠必须用\\- 4个反斜杠表示.

PHP手册:

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

所以,你的preg_replace()陈述应该是这样的:

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

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

echo preg_replace('~[/\\\\][\w-]*$~', '', $str);
Run Code Online (Sandbox Code Playgroud)

在这里,\w匹配ASCII字符[A-Za-z0-9_].你也可以避免/使用不同的分隔符来逃避正斜杠- 我~上面已经使用过了.