正则表达式:未知修饰符 '\'

Fab*_*Pas 3 php regex preg-match

我有以下正则表达式:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))
Run Code Online (Sandbox Code Playgroud)

但它给了我以下错误:

Unknown modifier '\'
Run Code Online (Sandbox Code Playgroud)

我尝试像这样转义反斜杠:

(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))
Run Code Online (Sandbox Code Playgroud)

没有任何运气......我也尝试用波浪号替换反斜杠,再次没有运气。我已经在互联网和 SO 上搜索了有关“\”作为未知修饰符的任何详细信息,但再次没有运气。这里出了什么问题?

应要求提供的代码示例:

$regex = '(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))';
return !preg_match($regex, $url);
Run Code Online (Sandbox Code Playgroud)

谢谢!

Sha*_*ran 5

只需使用这样的反斜杠转义单引号

$regex = '(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))';
Run Code Online (Sandbox Code Playgroud)

编辑 :

关于未知修饰符警告..

我假设你可能已经在你的preg函数中得到了它。

preg 模式需要一对字符来分隔模式本身。

您应该添加分隔符之类的东西,请参见此处...

$body = preg_replace("/(.*)<!-- start -->(.*)<!-- end -->(.*)/","$2",$body);
                ------^                                 -----^
Run Code Online (Sandbox Code Playgroud)

Source


Tot*_*oto 5

您必须在正则表达式周围添加分隔符:

$regex = '~(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))~';
Run Code Online (Sandbox Code Playgroud)

作为分隔符,您几乎可以使用除空格或单词字符以外的任何字符。
我建议您使用正则表达式中不存在的字符,这样您就不必逃避它。
我在这里使用~