使用Regex分割没有被div或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+[^>]*)>(.*?)</ps*>/';
if(preg_match_all($Pattern, $Content, $keywords)){
}

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

本身,它将内容保留在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>

对于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></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);

最新更新