使用PHP

时间:2015-06-02 13:39:46

标签: php regex

我有一个恰好是HTML的sting,我希望使用PHP删除它的服务器端的特定部分(请不要使用JavaScript / jQuery解决方案)。该字符串需要在其中包含某些标识符以标记可能希望删除的部分,并且我还将有一些变量指示应删除哪些标记的部分。这些指标标签不应保留在最终修改的字符串中。

例如,考虑$html_1我在其中包含capture属性来标记可能被删除的部分。或$html_2我将[capture]包裹在可能被删除的标记周围。请注意,这些只是我想要标记部分的两种可能方式,并且可以使用任何其他允许将字符串存储在数据库中的方法。

对于两者,我有一个<h2>块,<h1>块和<p>块,其中capture用于表示可能删除或不删除的部分。然后给定$modify表示应该或不应该删除哪些部分,如何生成等于$html_new的新字符串?我想也许DOMDocumentstr_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;
?>

2 个答案:

答案 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;
}