【问题标题】:Regex strip all html tags excluding <br> & <a class='user'></a>正则表达式去除所有 html 标签,不包括 <br> & <a class='user'></a>
【发布时间】:2011-08-27 00:36:27
【问题描述】:

我对正则表达式比较陌生,但我的目标是从字符串中删除所有 html 标记,不包括 &lt;br&gt;s 和 &lt;a&gt; 标记为 class='user'。我想使用这个正则表达式从 contentedittable 字段中清除不需要的 html 垃圾。

希望你们中的一位正则表达式大师可以提供帮助...

下面是一个测试示例: http://gskinner.com/RegExr/?2tpai

我想我已经接近了,但是 a class='user' 的结束标记目前仍被选为垃圾。

【问题讨论】:

  • 不要自己动手。这是重要且不平凡的事情。它已经完成了无数次。重复使用它
  • “我想使用这个正则表达式从 contentedittable 字段中清除不需要的 html 垃圾。” 如果您正在处理 contentEditable 字段,为什么不直接遍历 DOM 树呢? HTML 很难用正则表达式解析。 (事实上​​,我认为这在技术上是不可能的,但如果你真的努力,你可以得到一个接近的近似值。)
  • 大概是你想去掉的标签,而不是它们元素的内容?
  • 如果class='user' 不是&lt;a&gt; 标签的first 属性怎么办?如果锚标签里面有其他标签(比如&lt;img&gt;)怎么办?如果在你的开始标签之后的任何地方都有 cmets,你怎么知道跳过出现在其中的匹配项?我不认为你很接近 - 我并不是要批评,只是为了强调我的回答中的一点,即这在技术上是不可能,甚至“足够好”随便用是非常非常辛苦的。毫无疑问,还有更多我们都没有考虑过的问题。
  • @TJCrowder 好的,如果 regex 是错误的选择,您能否举一个示例,说明如何在我的示例中使用 javascript/jquery 通过 DOM 操作来清理 html?

标签: javascript html regex tags


【解决方案1】:

我建议你这样做:

<(?!a class='user'|br|/a)[^>]+>

即,您在 html all 中保留 &lt;/a&gt; 标记,这不会太麻烦。

这很 hacky,但是正则表达式引擎会立即跳过以 &lt;a class='user' 开头的一段文本并开始寻找下一个 &lt;...

总的来说,根据我通过正则表达式转换 html 的经验,我发现唯一安全的方法是将过程拆分为几个中间步骤,例如首先处理 &lt;a class='user'..../a&gt;s,然后处理其余部分,但是如果不将 &lt;a class='user'..../a&gt; 转换为不同的东西作为中间步骤,我看不到一种简单的方法。

【讨论】:

  • 这个表达式很好用,只是它忽略了所有的 标签,而不仅仅是那些与 匹配的标签
【解决方案2】:

怎么样:

<?php
$new_content = strip_tags($content, '<a><br>');

这将允许所有br 和所有a 元素。不幸的是,在此功能中,您无法允许/禁止像 class="user" 这样的元素属性。此函数始终允许/禁止具有 all 属性的指定元素。

【讨论】:

  • 这是一个 javscript 问题,而不是 php。还是谢谢。
  • 对不起,没有检查标签:(
【解决方案3】:

正式地说你是can't parse HTML with regex,因为HTML is not a regular language。另请参阅Can you provide some examples of why it is hard to parse XML and HTML with a regex? 了解一些噩梦材料。

毫无疑问,您可以想出一些适用于“大多数”情况或“合理”情况的正则表达式,但如果您通过正则表达式清理用户输入,这还不够。尝试通过复杂的文本替换和转义来替换 SQL 参数并不是一百万英里。不管你有多聪明,正确的答案是使用不同的方法,因为一些弱点仍然存在。

在这种情况下,该方法将使用 HTML 解析库来读取文本,然后从解析的 DOM 中删除 &lt;br&gt; 和 &lt;a&gt; 标记。 (这比尝试从原始文本中删除一系列字符要强大得多,并且可能还会创建更易于理解的源代码!)。事实上,由于您可能正在谈论客户端中的 JS,您已经拥有可用的 DOM,由浏览器预先解析,所以这将是一个简单的操作。

如果您不熟悉 JavaScript 的 DOM 操作方法,我认为quirksmode intro 平易近人且内容丰富。

【讨论】:

  • 问题是我想剥离标签但保留这些标签中的任何文本内容。我对 jQuery 有经验,但可以轻松了解如何做到这一点...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2014-05-13
  • 1970-01-01
  • 2011-05-15
  • 2011-05-03
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多