删除CR,LF,标签 - <pre> and <code></code></pre>除外

时间:2012-11-26 23:14:55

标签: regex preg-replace

我想删除HTML字符串中的所有CR,LF和标签,除非它们存在于<pre><code>中(假设它们已正确关闭。有没有办法可以做这在PHP?

1 个答案:

答案 0 :(得分:0)

我尝试了一段时间使用正则表达式断言,但我不认为这可能是因为PHP似乎不允许我在前瞻/后期匹配中使用通配符。

修改 前面的例子不适用于pre&amp; amp;中的嵌套元素。码。这样您就可以捕捉想要保留的间距,移除所有间距,然后将所需的间距放回:

//$html is your initial html string with line returns and spaces

//pattern to match open tag, inner content and closing tag
$pattern = '/<(pre|code)((?!<\/?\1).)*?<\/\1>/s';

//before: capture the string pattern of the multiline elements
preg_match_all($pattern, $html, $before);

//remove all LF, CR and indentation tabs
$html = preg_replace('/(\t|\r|\n)/s', '', $html);

//after: capture the string pattern of the condensed elements
preg_match_all($pattern, $html, $after);

//loop through the matches to replace the after with the before
foreach($after[0] as $k => $v){
    $html =  str_replace($v, $before[0][$k], $html);
}

如果标签未正确关闭,它们将不适合匹配模式,因此将被跳过并剥离间距。