RegEx替换HTML标记中的所有宽度和高度值

Emi*_*mil 1 html php regex dom

我从另一篇文章中获得了这个RegEx,但它没有完全像它应该的功能.

这是模式:/(<[^>]+ (height|width)=)"[^"]*"/gi和替换:$1"auto"

这是一个典型的替换字符串: <p width="123" height="345"></p>

现在,我希望这会返回<p width="auto" height="auto"></p>,但它会返回<p width="123" height="auto"></p>.

你能帮我弄清楚如何替换HTML标签中的宽度和高度值吗?哦,我真的希望它也适用于小的叛逆迹象(例如width='*').

非常感谢!

lon*_*day 9

不要用正则表达式这样做.使用DOM代替 - 它不是很难:

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

$xpath = new DOMXPath($dom);

$widthelements = $xpath->query('//*[@width]'); // get any elements with a width attribute

foreach ($widthelements as $el) {
    $el->setAttribute('width', 'auto');
}

$heightelements = $xpath->query('//*[@height]'); // get any elements with a height attribute
foreach ($heightelements as $el) {
    $el->setAttribute('height', 'auto');
}

$yourHTML = $dom->saveHTML();
Run Code Online (Sandbox Code Playgroud)

简单地删除属性可能更好 - 如果是,则执行$el->removeAttribute('width');或类似操作height.

  • @Emil:你有没有证明你的应用程序的这部分是一个性能热点? (2认同)
  • 执行速度,可能要慢几度.实际效果,相当高.发展速度,甚至更高.除非DOM工作是性能的显着消耗(这是不太可能的),除非你可以让正则表达式完成相同的工作(甚至更不可能),所以选择DOM方法. (2认同)