Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php正则表达式查找行开始和空行之间的字符串,不包含以任何html标记开头的行_Php_Regex - Fatal编程技术网

php正则表达式查找行开始和空行之间的字符串,不包含以任何html标记开头的行

php正则表达式查找行开始和空行之间的字符串,不包含以任何html标记开头的行,php,regex,Php,Regex,你好,我必须把没有html标记的任何行转换成这种格式 <p>lorem ipsum</p> lorem ipsum e、 g 你好,世界 英雄联盟 乱数假文 多洛坐 艾米特 康塞特 应该解析为 <p>hello world</p> <h2>lol</h2> <p>lorem ipsum dolor sit amet</p> <p>consetetur</p> 你好

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

<p>lorem ipsum</p>
lorem ipsum

e、 g

你好,世界
英雄联盟
乱数假文
多洛坐
艾米特
康塞特
应该解析为

<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>
#头1//头1
##标题2//标题2

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

。。。我的标题将被解析,但就有效的HTML2.0而言,段落不是。所以,要创建输入HTML的HTML,在每一个双线分隔符中添加额外的段落,非常简单:

$html = str_replace("\n\n", '<p>', $html);
$html=str\u replace(“\n\n”、“”、$html);
请记住,此解决方案非常特定于输入和输出,因此它可能只解决问题中的部分场景。然而,我无法从你的问题中得到足够的信息来给出更好的答案

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

$html = str_replace("\n\n", "<p>", $yourContent);
$dom = new DOMDocument;
$dom->loadHTML($html);
echo $dom->saveHtml();
$html=str\u replace(“\n\n”、“”、$yourContent);
$dom=新的DOMDocument;
$dom->loadHTML($html);
echo$dom->saveHtml();
DomDocument可以将HTML2转换为HTML4.0.1,并将添加所有需要的HTML元素,如doctype、HTML和body。只缺少标题和标题。

这在java中适用:

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

input.replaceAll(“(?这有点冗长,但应该是实心的。它使用
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();
$dom=新的DOMDocument;
$dom->loadXML('.$yourContent'.');
$xpath=newdomxpath($dom);
$nodes=$xpath->query('/root/text()');
函数wrapnode($node){
全球$dom;
$p=$dom->createElement('p');
$node->parentNode->replaceChild($p,$node);
$p->appendChild($node);
}
foreach($node作为$node){
如果($node->nodeType===XML\u TEXT\u node){
$node->nodeValue=trim($node->nodeValue);
而($location=strpos($node->nodeValue,“\n\n”)){
$newnode=$node->splitText($location);
wrapnode($node);
$node=$newnode;
$node->nodeValue=trim($node->nodeValue);
}
wrapnode($node);
}
}
echo$dom->saveXML();

记住必须的:)/^[^()](.*)(^[\r?\n?]$)/m被替换为\1

这是我在不同变量中尝试的正则表达式输入已经包含HTML标记,所以你的问题对你想要实现的目标有点不精确。每个浏览器都支持。效果很好。
$node->nodeValue=trim($node->nodeValue);
将注意
“\n\n“
的结尾永远找不到,因此大多数代码都是无用的-如果我没有发现的话。@hakre是的,
\n\n
被此代码删除。无论如何,它们在呈现的HTML中都会被忽略。这段代码在字符串的中间出现在代码> \n\n/c>。但是这不意味着简单的文本行也会被转换成段落吗?你指的是“简单的文本行”是什么意思?(对于OP提供的示例数据,它是有效的。)
$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();