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