警告:preg_replace():未知的修饰符']'

时间:2013-12-20 14:05:39

标签: php regex wordpress preg-replace

我有以下错误:

  

警告:preg_replace():第38行的xxx.php中的未知修饰符']'

这是第38行的代码:

<?php echo str_replace("</ul></div>", "", preg_replace("<div[^>]*><ul[^>]*>", "", wp_nav_menu(array('theme_location' => 'nav', 'echo' => false)) )); ?>

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:83)

错误发生的原因

在PHP中,正则表达式需要包含在一对delimiters中。分隔符可以是任何非字母数字,非反斜杠,非空白字符; /#~是最常用的。请注意,也可以使用括号样式分隔符,其中开始和结束括号是起始和结束分隔符,即<pattern_goes_here>[pattern_goes_here]等都是有效的。

Unknown modifier X ”错误通常发生在以下两种情况中:

  •   

    当您的正则表达式缺少分隔符时。

  •   

    当您使用分隔符模式而不转义时。

在这种情况下,正则表达式为<div[^>]*><ul[^>]*>。正则表达式引擎会将<>之间的所有内容视为正则表达式模式,然后将所有内容视为修饰符。

Regex: <div[^>  ]*><ul[^>]*>
       │     │  │          │
       └──┬──┘  └────┬─────┘
       pattern    modifiers

]这里是一个未知的修饰符,因为它出现在结束>分隔符之后。这就是PHP抛出该错误的原因。

根据模式,未知修饰符投诉可能与*+p/)或几乎任何投诉有关。其他字母/符号。只有imsxeADSUXJuvalid PCRE modifiers

如何解决

修复很简单。只需使用任何有效的分隔符包装您的正则表达式模式。在这种情况下,您可以选择 并获取以下内容:

~<div[^>]*><ul[^>]*>~
│                   │
│                   └─ ending delimiter
└───────────────────── starting delimiter

如果您在使用分隔符时收到此错误,则可能是因为该模式本身包含所述分隔符未转义的出现。

或转义分隔符

/foo[^/]+bar/i肯定会引发错误。所以如果它出现在正则表达式的任何地方,你可以使用 \ 反斜杠来逃避它:

/foo[^\/]+bar/i
│      │     │
└──────┼─────┴─ actual delimiters
       └─────── escaped slash(/) character

如果您的正则表达式模式包含如此多的分隔符字符,则这是一项繁琐的工作。

当然,更简洁的方法是使用不同的分隔符。理想情况下,一个字符不会出现在正则表达式模式中的任何位置,例如# - #foo[^/]+bar#i

更多阅读:

答案 1 :(得分:0)

如果您想获取异常(InvalidPatternException),而不是警告或使用preg_last_error(),请考虑使用T-Regx library

<?php
try 
{
    return pattern('invalid] pattern')->match($s)->all();
}
catch (InvalidPatternException $e) 
{
    // your pattern was invalid
}