我有以下正则表达式:
(?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);
谢谢!
答案 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);
------^ -----^
答案 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
因此,解决方案是使用适当的正则表达式分隔符,就像其他人在这里向您展示的那样。