我有一个恰好是HTML的sting,我希望使用PHP删除它的服务器端的特定部分(请不要使用JavaScript / jQuery解决方案)。该字符串需要在其中包含某些标识符以标记可能希望删除的部分,并且我还将有一些变量指示应删除哪些标记的部分。这些指标标签不应保留在最终修改的字符串中。
例如,考虑$html_1
我在其中包含capture
属性来标记可能被删除的部分。或$html_2
我将[capture]
包裹在可能被删除的标记周围。请注意,这些只是我想要标记部分的两种可能方式,并且可以使用任何其他允许将字符串存储在数据库中的方法。
对于两者,我有一个<h2>
块,<h1>
块和<p>
块,其中capture
用于表示可能删除或不删除的部分。然后给定$modify
表示应该或不应该删除哪些部分,如何生成等于$html_new
的新字符串?我想也许DOMDocument
,str_replace
或正则表达式解决方案可行,但不确定。
<?php
$html_1 = <<<EOT
<div>
<div>
<div>
<h1 capture="a">bla bla bla</h1>
<p>bla</p>
<h2 capture="b">bla bla<span>bla</span></h2>
<h1>bla bla bla bla</h1>
</div>
</div>
<div>
<p capture="c">bla bla bla</p>
<h1>bla bla</h1>
</div>
</div>
EOT;
$html_2 = <<<EOT
<div>
<div>
<div>
[caption id="a"]<h1>bla bla bla</h1>[/caption]
<p>bla</p>
[caption id="b"]<h2>bla bla<span>bla</span></h2>[/caption]
<h1>bla bla bla bla</h1>
</div>
</div>
<div>
[caption id="c"]<p>bla bla bla</p>[/caption]
<h1>bla bla</h1>
</div>
</div>
EOT;
$modify=array('a'=>true,'b'=>false,'c'=>true);
$html_new = <<<EOT
<div>
<div>
<div>
<p>bla</p>
<h2>bla bla</h2>
<h1>bla bla bla bla</h1>
</div>
</div>
<div>
<h1>bla bla</h1>
</div>
</div>
EOT;
?>
答案 0 :(得分:1)
我使用$html_2
,因为我觉得它更容易。这应该是诀窍:
foreach($modify as $letter=>$remove) {
$pattern = '/\[caption id="' . $letter . '"\](.*)\[\/caption\]/U';
$replace = ($remove) ? '' : '$1';
$html_2 = preg_replace($pattern, $replace, $html_2);
}
$html_2 = preg_replace('/^\h*\v+/m', '', $html_2); // Optional: Removing empty lines
如果$remove
对于某个字母为false,则将匹配的字符串部分替换为第一个捕获组(即捕获标记所包围的所有内容)。如果它是真的,它将被替换为空字符串。
答案 1 :(得分:0)
您可以使用preg_replace替换包含capture =&#34; a&#34;用空白行,像这样:
$stripped = preg_replace(/^.*(capture="a").*$/, '', $html_1);
如果你将它包含在一个函数中,你可以传递一个参数去掉a,b或c:
function strip($capture,$block){
$stripped = preg_replace(/^.*(capture="'.$capture.'").*$/, '', $block);
return $stripped;
}