【问题标题】:Regular expression to remove div styles/classes in PHP在 PHP 中删除 div 样式/类的正则表达式
【发布时间】:2010-11-14 19:26:35
【问题描述】:

我想有选择地从字符串中解析出 HTML。我使用 strip_tags 来允许 div,但我不想保留字符串中的 div 样式/类。也就是说,我想要:

<div class="something">text</div>
<div style="something">text</div>

简单地变成:

<div>text</div>

在这两种情况下。

有人可以帮忙吗?谢谢!

【问题讨论】:

标签: php regex


【解决方案1】:

将以下正则表达式替换为空:

(?<=<div.*?)(?<!=\t*?"?\t*?)(class|style)=".*?"

【讨论】:

  • 如果有一个属性包含class=style=&lt;div title="style=" class="foo"&gt; 怎么办?
  • @J V:这不会解决问题,例如见&lt;div title=" style=" class="foo"&gt;
  • 好吧,它现在变得复杂了,但我想我明白了......老实说,如果 html 搞砸了,正则表达式是最不需要担心的 :)
  • 别管空格,这个正则表达式不起作用,因为它需要可变长度的lookbehinds,而PHP(像大多数口味一样)不这样做。无论如何,Lookbehinds 绝不应该是您的首选;几乎总是有更简单的方法。
  • 啊,在那种情况下,我屈服于文森特:)
【解决方案2】:

这是一个例子:

preg_replace('`<div (style="[^"]*"|class="[^"]*")>([^<]*)</div>`i', "<div>$1</div>", $str);

基本上,这将 div 的内容与样式或类属性相匹配。然后,您删除所有内容以仅保留 &lt;div&gt;content&lt;/div&gt;

它比 J V 的版本长,但它不会取代像 &lt;div style="blablabla" color="blablabla"&gt;content&lt;/div&gt; 这样的东西,例如。可能是也可能不是你想要的。

【讨论】:

  • 我看到一个问题,使用 OP 给出的例子 :) (提示,中继器是贪婪的)
  • 其实,.阶级是贪婪的。 [^"] 不是,它在遇到第一个 " 之后停止。不用担心,我会在发布之前测试我的代码(通常至少!)
  • 想一想,这没有意义。我有一个匹配除“之外的每个字符”的类。当它遇到“时会发生什么?它停止匹配。这与 * 或任何量词无关。正如我所说,我用 OP 的示例测试了我的代码,它工作正常。
  • 啊,是的,我明白了……虽然我的只是删除了样式/类属性本身,所以其他属性仍然存在。
【解决方案3】:

作为 regexp 的一个选项(这总是让我感到害怕), 我建议使用 xml_parse_into_struct。

参见 php.net,这是第一个示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2011-04-06
    • 2023-04-02
    • 2011-02-19
    相关资源
    最近更新 更多