PHP函数preg_replace多行条件注释

时间:2012-02-11 02:17:10

标签: php regex preg-replace

我正在尝试在php中编写一个函数,它将遍历mySQL数据库并删除所有条件注释。

我要替换的文字如下:

<!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG /> </o:OfficeDocumentSettings> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:DoNotShowRevisions /> <w:DoNotPrintRevisions /> <w:DoNotShowMarkup /> <w:DoNotShowComments /> <w:DoNotShowInsertionsAndDeletions /> <w:DoNotShowPropertyChanges /> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /><![endif]-->

这是我的代码

$content = array('1' => $my_text_with_conditional_quotes)

foreach($content as $id => $v){
    print $v .' <br>';
    $str = addcslashes(preg_replace("/<!(--)?(?=\[)(?:(?!<!\[endif\]\1>).)*<!\[endif\]\1>/s",'',$v));
    print $str . '<br>';
    print $id . '<br>'; 
    exit; 
}

它不匹配任何东西。我错过了什么?

3 个答案:

答案 0 :(得分:1)

使用单引号'

封装正则表达式
'/<!(--)?(?=\[)(?:(?!<!\[endif\]\1>).)*<!\[endif\]\1>/s'

或双重转义\以引用捕获组

"/<!(--)?(?=\[)(?:(?!<!\[endif\]\\1>).)*<!\[endif\]\\1>/s"

答案 1 :(得分:0)

将通配符时段从此处移开:1>).)*到此处:1>)).*

另外,RegexPal非常适合现场测试你的正则表达式,看看它们匹配的内容。

答案 2 :(得分:0)

不要使用正则表达式来解析xml。 您可以使用php字符串函数解决此问题。它将是这样的:

while (1==1) {

    $openingTagOffset = strpos($field, "<!--[if gte mso 9]>");
    if ($openingTagOffset === false) break;
    $closingTag = "<![endif]-->";
    $closingTagOffset = strpos($field, $closingTag, $openingTagOffset);
    $field = substr_replace($field, "", $openingTagOffset, $closingTagOffset - $openingTagOffset + strlen($closingTag));

}