使用正则表达式拆分未包含在 div 或 Table 中的段落

Use Regex to Split Paragraphs that are not wrapped in div or Table

我正在尝试在我的内容中的每个段落之后插入一些文本。

我通过 </p> 展开我的内容这是使用以下代码完成的:

    $Paragraphs = explode( '</p>', $Content);
    foreach($Paragraphs as $Paragraph){
        // Some code
    }

现在我的 $Content 看起来像:

<p></p>
<p></p>
<p></p>
<div><p></p></div>
<p></p>
<p></p>
<div><p></p></div>

如果 <p> 没有包裹在 <div><table> 内,我想拆分。

你可以说 </p> 后面应该有一个 <p>

我读到 Regex 可以帮助实现它。

这是我构建的基本正则表达式:


$Pattern = '/<p(|\s+[^>]*)>(.*?)<\/p\s*>/';

if(preg_match_all($Pattern, $Content, $keywords)){

}

这个正则表达式目前从数组中删除了

本身,它将内容保留在 p 中而不是

本身,并且它不检查它是否具有

之前或之后

$string = '<p></p>
<p></p>
<p></p>
<div><p></p></div>
<p></p>
<p></p>
<div><p></p></div>';

$ex = explode("\n",$string);

foreach($ex as $k => $p){
    if(str_contains($p,"<div>") || str_contains($p,"<table>")){
        unset($ex[$k]);
    }
}

print_r($ex);

对于 DOM 元素上的更复杂的微操作,我建议使用 DomDocument。 (https://www.php.net/manual/en/class.domdocument.php)

PHP 解决方案 为此,您可以使用 PHP 字符串函数 str_replace。 在您的循环中,您可以构建替换字符串,然后将其作为参数传递给 str_replace 函数。

$text = '<p>hello</p> <p>Hi</p>';
$replace = '</p><span style="color: red;">World</span>';

echo str_replace("</p>",$replace,$text);

CSS 简单内容的解决方案 你可以用纯 css.

p::after { 
  content: " - World";
}
<p>1 x Hello</p>
<p>2 x Hello</p>

如果我理解你的问题,你有一个带有标签的字符串,例如:

$string = "
<p> Sometext 1 </p>
<p> Sometext 2 </p>
<p> Sometext 3 </p>
<div><p> Sometext Inside A Div </p> </div>
";

并且您想在每个 p 之后添加另一个元素,该元素不包含在任何其他元素中。你想纯粹通过 PHP 来做到这一点,对吗?

我认为你最好的选择是使用 DOMDocument.

看看下面的解决方案:

$doc = new DOMDocument();
$doc->loadHTML($string);
foreach ($doc->getElementsByTagName('p') as $idx => $item) {
    if($item->parentNode->nodeName == 'body') {
        $fragment = $doc->createDocumentFragment();
        $fragment->appendXML('<div> <div> <img src="image.jpg"/> </div> </div>');
        $item->parentNode->insertBefore($fragment, $item->nextSibling);
    }
}    

echo $doc->saveHTML();

基本上我把你的字符串转换成 HTML DOM 然后我遍历所有 p 元素,如果它们的父元素是 body 然后我创建一个文档 fragment 它将附加 XML 原始数据来创建您的深层嵌套结构,而无需单独创建每个元素。最后,我在每次迭代 p 元素后插入新创建的片段。

输出将如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
    <body>
        <p> Sometext 1 </p>
        <div> 
            <div> 
                <img src="image.jpg"> 
            </div> 
        </div>
        <p> Sometext 2 </p>
        <div> 
            <div> 
                <img src="image.jpg"> 
            </div> 
        </div>
        <p> Sometext 3 </p>
        <div> 
            <div> 
                <img src="image.jpg"> 
            </div> 
        </div>
        <div>
            <p> Sometext Inside A Div </p> 
        </div>
    </body>
</html>