【问题标题】:Regular expression: Unknown modifier '\'正则表达式:未知修饰符 '\'
【发布时间】:2013-12-11 08:55:01
【问题描述】:

我有以下正则表达式:

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

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

应要求提供的代码示例:

$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);

谢谢!

【问题讨论】:

  • 反斜杠用于转义特殊字符。你必须逃避整个正则表达式才能正确使用它,Shankar Damodaran 已经展示了如何。
  • 你如何使用这个正则表达式?给我们看一些代码,我怀疑你没有使用分隔符。
  • 我已经添加了我的用法@M42。

标签: php regex preg-match


【解决方案1】:

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

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

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

【讨论】:

  • 这成功了!我现在明白了。正则表达式有时对我来说似乎是一个难题..
  • @FabianPas,真的。这就是为什么我从不冒险太远。
  • 我不知道您可以像这样定义自己的分隔符...
  • @JacobThomason:您可以使用任何非字母数字、非反斜杠、非空白字符as delimiter
【解决方案2】:

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

$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

【讨论】:

  • 这实际上似乎并没有解决问题。它仍在抛出未知修饰符“\”警告。
【解决方案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

所以解决方案是放置一个适当的正则表达式分隔符,就像这里的其他人向您展示的那样。

【讨论】:

    猜你喜欢
    • 2013-06-27
    • 2011-11-09
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多