我将HTML段落(<p></p>
)插入到一段文本中,如下所示:
$text = '<p>' . preg_replace("/('n|'r|'r'n)+/i", "</p><p>", $text) . '</p>' ;
这似乎工作得很好,除了我不想在<code></code>
块内的任何段落,因为这些块内的内容是预格式化的(使用white-space:pre;
风格)。
我不知道如何最好地处理这个问题。我试着在上面的代码行之后删除任何这样的标签,但这给我带来了一些麻烦,我认为最好不要首先插入它们。
在上面的正则表达式中排除是可能的和/或实际的吗?如果不是,还有什么?
感谢编辑:根据下面无名的回答想出了这个代码。
$chunks = preg_split("/(<code>.*?<'/code>)/is", $text, -1, PREG_SPLIT_DELIM_CAPTURE) ;
$text = '' ;
foreach($chunks as $chunk) {
if (preg_match("/^<code>/i", $chunk)) {
$text .= $chunk ;
} else {
$text .= '<p>' . preg_replace("/('n|'r)+/i", "</p><p>", $chunk) . '</p>' ;
}
}
嗯,这是可能的与PCRE正则表达式引擎。然而,非常不合理和资源繁重。
$text = '<p>' . preg_replace("/('n|'r|'r'n)+(?!(.(?!<code>))*<'/code>)|('n|'r|'r'n)+(?=<code>)/is", "</p><p>", $text) . '</p>' ;
使用DOM可能是最好的解决方案,如果您可以在此操作上花费一些额外的RAM。如果没有,您可以事先将字符串拆分为<code>
块……</code>
和其他所有内容,而不是在<code>
中使用您的regex块,然后将其粘回字符串。
永远永远永远永远不要尝试用正则表达式解析HTML。
使用例如PHP的DOM: http://php.net/manual/en/book.dom.php
:)