phpregex在起始行和空行之间查找字符串,不包含以任何html标记开头的行


php regex find string between line start and empty line without lines that starts with any html tags

你好,我必须将任何没有html标记的行转换为这种格式的

<p>lorem ipsum</p>

例如

hello world
<h2>lol</h2>
lorem ipsum
dolor sit
amet
consetetur

应解析为

<p>hello world</p>
<h2>lol</h2>
<p>lorem ipsum
dolor sit
amet</p>
<p>consetetur</p>

我在php函数preg_replace()中尝试过这种方法;

有人能帮忙吗?

附言:我将尝试将此语法转换为html

# header 1 // <h1>header 1</h1>
## header 2 // <h2>header 2</h2>

并且所有没有标题的行都应该解析为

。。。我的标题将被解析,但段落不是

这有点冗长,但应该是可靠的。它使用DOMDocument而不是regex:

$dom = new DOMDocument;
$dom->loadXML('<root>' . $yourContent .'</root>');
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('/root/text()');
function wrapnode ($node) {
    global $dom;
    $p = $dom->createElement('p');
    $node->parentNode->replaceChild($p, $node);
    $p->appendChild($node);
}
foreach ($nodes as $node) {
    if ($node->nodeType === XML_TEXT_NODE) {
        $node->nodeValue = trim($node->nodeValue);
        while ($location = strpos($node->nodeValue, "'n'n")) {
            $newnode = $node->splitText($location);
            wrapnode($node);
            $node = $newnode;
            $node->nodeValue = trim($node->nodeValue);
        }
        wrapnode($node);
    }
}
echo $dom->saveXML();

这在java:中有效

input.replaceAll("(?<=''n''n)(?=''w)", "<p>").replaceAll("(?<=''w)(?=''n''n)", "</p>");

然而,它有点脆弱:它做了两个可能没有连接的替换。

就有效的HTML2.0而言<p>不需要是一对。因此,要创建输入HTML的HTML,每个换行符都有额外的段落,这非常简单:

$html = str_replace("'n'n", '<p>', $html);

请记住,这个解决方案非常特定于输入和输出,因此它可能只解决您问题中的部分场景。然而,我无法从你的问题中获得足够的信息来给出更好的答案。

就HTML 4.0.1而言,可以轻松创建:

$html = str_replace("'n'n", "<p>", $yourContent);
$dom = new DOMDocument;
$dom->loadHTML($html);
echo $dom->saveHtml();

DomDocument可以将HTML 2转换为HTML 4.0.1,并添加所有需要的HTML元素,如doctype、HTML和body。只缺少标题和标题。