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

时间:2011-08-20 14:57:26

标签: php regex

我将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>' ;
    }
}

2 个答案:

答案 0 :(得分:1)

嗯,有可能使用PCRE正则表达式引擎。然而,非常非理性和资源沉重。

$text = '<p>' . preg_replace("/(\n|\r|\r\n)+(?!(.(?!<code>))*<\/code>)|(\n|\r|\r\n)+(?=<code>)/is", "</p><p>", $text) . '</p>' ;

如果您可以在此操作上花费额外的RAM,则使用DOM可能是最佳解决方案。 如果没有,你可以预先将你的字符串拆分为<code> ... </code>和其他所有内容,而不是在<code>以外的块上使用正则表达式,而不是将其粘贴回字符串中。

答案 1 :(得分:-1)

从未尝试使用正则表达式解析HTML。

使用例如PHP的DOM:http://php.net/manual/en/book.dom.php

:)