我需要隐藏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
答案 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;
或display
,none
值后面的值不是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}}
享受它......!