【问题标题】:RegEx replace all values of width and height in HTML-tags正则表达式替换 HTML 标记中的所有宽度和高度值
【发布时间】:2011-09-14 00:21:44
【问题描述】:

我从另一个帖子中得到了这个 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='*')。

非常感谢!

【问题讨论】:

  • 一般来说,是的,这很麻烦 - 请参阅 stackoverflow.com/questions/1732348/… 以获得关于该主题的精彩讨论。 (X)HTML 太复杂,无法被正则表达式解析。
  • @andyb:有点毫无价值的讨论,因为它与 OP 案例关系不大;并且因为第二个只有少数人阅读过去的笑话并通过实际的技术解释。 (顺便说一句,现代正则表达式实现可以匹配嵌套结构/递归。同样,这里不相关。)
  • @mario 我正在回答@Emil 关于 RegEx + HTML = 麻烦的评论。另外,是什么让您认为 OP 不会阅读所有 cmets?但我同意你的观点,它与原始问题并不真正相关。

标签: php html regex dom


【解决方案1】:

请使用an HTML parser 而不是正则表达式。请问?

$input = '<p width="123" height="345"></p>';
$doc = DOMDocument->loadHTML($input);

// ... make changes ...

$output = $doc->saveHTML();

【讨论】:

    【解决方案2】:

    不要使用正则表达式。改用 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();
    

    直接删除属性可能会更好——如果是这样,请执行$el-&gt;removeAttribute('width');height 上的类似操作。

    【讨论】:

    • 谢谢。不过,与 RegEx 相比,它的速度如何?
    • @Emil 非常好,尤其是考虑到开发人员时间和 CPU 时间的相对成本。
    • @Emil:您是否表明您的应用程序的这部分是性能热点?
    • 执行速度,可能慢了几度。实际效果,要高得多。发展速度,还要高出几倍。除非 DOM 工作会严重消耗性能(这不太可能),并且除非您可以让正则表达式完成完全相同的工作(甚至更不可能),否则请选择 DOM 方法。
    • @Michael:不,不是真的,只是它可能一次解析大量数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2016-08-27
    相关资源
    最近更新 更多