我正在尝试在我的内容的每个段落之后插入一些文本。
我通过</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);