使用PHP和regex进行条件搜索和替换

时间:2015-05-15 22:18:07

标签: php regex

我需要隐藏HTML文件中的所有“p”标签,这些标签的内联样式的“左”偏移量为400或更多。

我希望一些聪明的正则表达式将“left:XXX”替换为“display:none”,如果“xxx”为400或更多。

例如,这个:

<p style="position:absolute;top:98px;left:472px;white-space:nowrap">

......需要替换为:

<p style="position:absolute;top:98px;display:none;white-space:nowrap">

逻辑似乎很简单,但正则表达式和PHP对我来说是令人难以置信的。

以下是我一直在尝试做的事情,但我只能逐行开展工作:

$width = preg_match("left:(.*?)px",$contents);
if ($width >399)
{
    $contents = preg_replace('/left:(.*?)px/', "display:none", $contents);
}

任何建议都非常感谢! :)

Wonko

2 个答案:

答案 0 :(得分:2)

不要相信正则表达式会解决世界上所有的问题:

使用DOMDocument从style属性中提取p标签,从style属性中提取带有正则表达式模式的“left”值,然后在“left”值大于或等于400时继续进行替换(测试此通过简单的比较)。

$dom = new DOMDocument;
$dom->loadHTML($html);

$pTags = $dom->getElementsByTagName('p');

foreach($pTags as $pTag) {
    if ($pTag->hasAttribute('style')) {
        $style = $pTag->getAttribute('style');
        $style = preg_replace_callback(
            '~(?<=[\s;]|^)left\s*:\s*(\d+)\s*px\s*(?:;|$)~i',
            function ($m) {
                return ($m[1] > 399) ? 'display:none;' : $m[0];
            },
            $style
        );
        $pTag->setAttribute('style', $style);
    }
}

$result = $dom->saveHTML();

编辑:在最糟糕的情况下,style属性可能包含display:block;displaynone值后面的值不是left。为了避免任何问题,最好将display:none放在最后。

$style = preg_replace_callback(
    '~(?<=[\s;]|^)left\s*:\s*(\d+)\s*px\s*(;.*|$)~i',
    function ($m) {
        return ($m[1] > 399) ? $m[2]. 'display:none;' : $m[0];
    },
    $style
);

答案 1 :(得分:1)

我已经对它进行了测试并且工作正常:

<p style="position:absolute;top:98px;display:none;white-space:nowrap">

输出:

{{1}}

享受它......!