php替换\n除非出现其他有效的HTML标记

php替换\n除非出现其他有效的HTML标记,php,regex,Php,Regex,我正在寻找一个函数,该函数通过用户输入文本字段来替换存储在db中的\n,除非已经存在HTML标记。这是针对CMS的,这样愚蠢的用户就没有那么多工作要做了 例如,如果用户在文本字段中写入以下内容: <H1>Title of page</H1> This is the first paragraph in the page. <H2>Sub section</H2> This is a sub-section. 页面标题 这是这一页的第一段。

我正在寻找一个函数,该函数通过用户输入文本字段来替换存储在db中的\n,除非已经存在HTML标记。这是针对CMS的,这样愚蠢的用户就没有那么多工作要做了

例如,如果用户在文本字段中写入以下内容:

<H1>Title of page</H1>

This is the first paragraph in the page.

<H2>Sub section</H2>

This is a sub-section.
页面标题
这是这一页的第一段。
小节
这是一个小节。
我希望函数返回:

<H1>Title of page</H1>

<p>This is the first paragraph in the page.</p>

<H2>Sub section</H2>

<p>This is a sub-section.</p>
页面标题
这是这一页的第一段

小节 这是一个小节


有人能帮上忙吗?

我会避免重蹈覆辙,你可能会遇到一大堆你必须处理的特殊规则。即使在你的问题中,规则也不清楚。它与\n有什么关系?我建议使用html解析器。PHP有一些:

$dom = new DOMDocument;
$dom->loadHTML($start);
$xpath = new DOMXPath($dom);

$nodes = $xpath->query('//text()[following-sibling::* or preceding-sibling::*]');
foreach ($nodes as $node) {
   $parent = $node->parentNode;
   $p = $dom->createElement('p', htmlentities($node->nodeValue, ENT_COMPAT, 'UTF-8'));
   $parent->insertBefore($p, $node);
   $parent->removeChild($node);
}

这将包装
中其他节点的同级文本节点,包括空格。一个重要的问题是:是否存在不需要包装的具有同级的文本节点?

为什么不使用像CKEditor这样的所见即所得编辑器?标题和内容中的问题不匹配?如果他们知道足够多的内容来放置
标记,为什么他们会忘记
标记?“你不能做任何防白痴的事情,因为白痴太他妈的聪明了。”你最好的办法是使用HTML解析器来解决它。正则表达式不能解决这种复杂的问题。我遇到这种情况是为了寻找一种替代PHP糟糕的lookback支持的方法。我只是想知道XPath是否可以处理bbcode标记。