php regex在行开头和空行之间找到字符串,没有以任何html标签开头的行

时间:2011-06-07 12:04:05

标签: php regex

你好我必须把没有html标签的任何行变成这种格式

<p>lorem ipsum</p>

e.g。

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();

有人可以提供帮助吗?

P.S。我会把这个语法变成html

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

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

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

3 个答案:

答案 0 :(得分:1)

这有点冗长,但它应该是可靠的。它使用DOMDocument而不是正则表达式:

$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();

答案 1 :(得分:0)

就有效的HTML 2.0而言,<p> does not need to be a pair。因此,要创建输入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。只缺少头部和头衔。

答案 2 :(得分:0)

这适用于java:

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

然而它有点脆弱:它会进行两次可能无法连接的替换。