【问题标题】:Find specfic HTML tag with poorly formed closing tag查找带有格式不正确的结束标记的特定 HTML 标记
【发布时间】:2016-05-09 06:39:22
【问题描述】:

我在为没有 /> 结束标记的特定 XHTML 标记(在本例中为 IMG 标记)优化 REGEX 查找/替换时遇到问题。

考虑这个两行示例文本:

<div id="newdocs-logo"><img src="../../../_DOC_DEPT/common/logo-white-250w.gif" alt="CloudPassage logo" height="38" width="251" /></div> 

<p class="newdocs-indent"><img src="CSM/config-scanning.png" width="692" height="359"></p>

仅当我在捕获组 #3 的否定字符类中包含 a-z 时,以下 REGEX 才能正常工作:

(<img)(.*?)([^a-z\/])(\>)

替换字符串:

$1$2$3/$4

我必须在字符类中包含a-z,因为如果我不这样做,那么在示例文本的第 1 行中,正则表达式继续通过正确关闭的 IMG 标记并找到 DIV 标记的结束标记。我在圈子里试验了前瞻/后视等等,但想不出更好的办法。

所以虽然我有一个可行的解决方案,但我很想知道是否有更优雅的方法来做到这一点,不需要在否定字符类中使用 a-z

【问题讨论】:

  • 您是否考虑过使用合适的 HTML 解析器?他们倾向于处理不符合 XHTML 的事情,比如 &lt;img&gt; 就好了。
  • 以“You can't parse [X]HTML with regex”结尾的线程可能重复。
  • 看起来(&lt;img)(.*?)([^[a-z\/])(\&gt;) 根本不起作用,因为[^[a-z\/] 有一个无与伦比的[
  • 我完全预料到了旧的“你不能用 REGEX 解析 HTML”的东西。但我真的不相信我在解析 HTML,只是在寻找特定的文本模式。这似乎与大量 REGEX 打印和在线资源一致,这些资源总是包含使用 REGEX 查找和替换特定 HTML 模式的示例......
  • @mgamba 他不想同时匹配两者,只匹配未正确关闭的那个

标签: regex


【解决方案1】:

使用正则表达式实际上非常简单。像img 这样的空标签实际上是很正常的。

假设img&gt; 之间至少有一个字符,则此正则表达式将起作用:

(<img[^>]*[^\/])>

基本上,它会捕获&lt;img,然后是直到&gt; 之前的最后一个字符的所有内容。如果那个字符不是/,你会得到匹配,并且可以使用替换字符串:$1/&gt;

(如果你没有得到匹配,那么你的标签已经正确关闭了。)

【讨论】:

  • 是的,自从我最初发布这篇文章以来,我已经学会了否定字符类的“技巧”。例如,故意不找到某些东西有时是 REGEX 成功的一种形式......
  • @RBV 是的,当我回答这个问题时,我就知道这是一个老问题。但是所有新问题都是FGITW。希望它可以在未来对其他人有所帮助......
猜你喜欢
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
相关资源
最近更新 更多