我有以下错误:
警告: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)) )); ?>
有人可以帮我解决这个问题吗?
答案 0 :(得分:83)
在PHP中,正则表达式需要包含在一对delimiters中。分隔符可以是任何非字母数字,非反斜杠,非空白字符; /
,#
,~
是最常用的。请注意,也可以使用括号样式分隔符,其中开始和结束括号是起始和结束分隔符,即<pattern_goes_here>
,[pattern_goes_here]
等都是有效的。
“ Unknown modifier X ”错误通常发生在以下两种情况中:
当您的正则表达式缺少分隔符时。
当您使用分隔符模式而不转义时。
在这种情况下,正则表达式为<div[^>]*><ul[^>]*>
。正则表达式引擎会将<
到>
之间的所有内容视为正则表达式模式,然后将所有内容视为修饰符。
Regex: <div[^> ]*><ul[^>]*>
│ │ │ │
└──┬──┘ └────┬─────┘
pattern modifiers
]
这里是一个未知的修饰符,因为它出现在结束>
分隔符之后。这就是PHP抛出该错误的原因。
根据模式,未知修饰符投诉可能与*
,+
,p
,/
或)
或几乎任何投诉有关。其他字母/符号。只有imsxeADSUXJu
为valid 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
}