php preg_replace():未知的修饰符','

时间:2013-01-27 15:54:52

标签: php preg-replace modifier

我有一个很长的$partner列表,写在一个公共文件中。

remove.inc

$partner =<<<EOT
"#<h1 class=\"logo\"(.*?)</h1>#s","#<h2 class=\"hidden\"(.*?)</h2>#s"
EOT;
//more $partner rules...

index.php

include(remove.inc);
$str = preg_replace(array($partner), '', $str);

这个回报:

警告:preg_replace():第12行的d:\ www \ indoor \ index.php中的未知修饰符','

2 个答案:

答案 0 :(得分:3)

$partner应该是一个字符串数组,但它不是:您使用HEREDOC语法将其定义为字符串。

字符串的第一个字符是双引号,正则表达式引擎将其视为分隔符。因此,当遇到下一个未转义的双引号时:

"#<h1 class=\"logo\"(.*?)</h1>#s",
                                ^

引擎假定后面的内容必须是正则表达式修饰符。由于,不是有效的修饰符,因此结果是错误。

正确的方法是

$partner = array(
    "#<h1 class=\"logo\"(.*?)</h1>#s",
    "#<h2 class=\"hidden\"(.*?)</h2>#s",
);

并用作

$str = preg_replace($partner, '', $str);

答案 1 :(得分:1)

您的heredoc字符串将包含引号和逗号(如示例中所定义)。这将导致您的常规异常实际上由引号分隔,而不是哈希标记,因此第一个常规异常在#s"之后结束,接下来是逗号,正如您的错误消息所述,它不是有效的常规异常标志。也没有什么可以将你的heredoc表达式拆分成数组中的单独元素 - array($partner)会导致一个数组包含一个包含整个heredoc字符串的元素。