在文本中插入段落,代码块除外


Insert paragraphs in text, except within code blocks

我将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

:)