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

时间:2013-12-11 08:55:01

标签: 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`!()\[\]{};:'\".,<>?«»“”‘’]))

但它给了我以下错误:

Unknown modifier '\'

我试着像这样逃避反斜杠:

(?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`!()\\[\\]{};:'\".,<>?«»“”‘’]))

没有任何运气..我也尝试用波浪线替换反斜杠,再次没有运气。我已经搜索了互联网和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);

谢谢!

3 个答案:

答案 0 :(得分:4)

使用像这样的反斜杠来逃避单引号

$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`!()\[\]{};:\'\".,<>?«»“”‘’]))';

编辑:

关于未知修改器警告..

我认为您可能已经在preg函数中获得了这些功能。

  

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

你应该在这里添加一个分隔符类型的东西......

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

Source

答案 1 :(得分:4)

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

$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`!()\[\]{};:\'\".,<>?«»“”‘’]))~';

作为分隔符,除了空格或单词字符外,几乎可以使用任何字符 我建议你使用你的正则表达式中没有的字符,所以你不能逃避它 我在这里使用~

答案 2 :(得分:3)

由于我错过了解释警告的答案,我再添加一个。

preg函数需要一个正则表达式分隔符,你忘了明确地放一个,所以正则表达式字符串中的第一个字符用作分隔符。由于它是一个开括号,因此相应的分隔符是右括号。

$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`!()\[\]{};:\'\".,<>?«»“”‘’]))';
          |  || 
          |  || first character after the closing delimiter is an unknown modifier ==> your warning !
          |  | first closing bracket is the other delimiter
          | first opening bracket is the delimiter

这是因为正如正则表达式分隔符也可以使用一对括号。 See php doc on Delimiters

因此,解决方案是使用适当的正则表达式分隔符,就像其他人在这里向您展示的那样。