使用正则表达式拆分未包含在 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>
我正在尝试在我的内容中的每个段落之后插入一些文本。
我通过 </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>