【问题标题】:Remove href link from html that matches text ignoring inner link tags using regex从 html 中删除匹配文本的 href 链接,忽略使用正则表达式的内部链接标签
【发布时间】:2014-01-30 13:09:24
【问题描述】:

知道所有SO answers that warn against Regex to parse html 我有一个场景,解析器和 DOM 技巧是不可能的,需要使用正则表达式来删除具有定义文本值的标签和内容。例如在:

<div>foo bar</div
<a href="http://example.com">some text</a>
<div>foo bar foo bar</div> 

我目前正在使用这个函数来解析出匹配的链接

/**
 * Removes links from html text
 * @param {string} html The html to be cleaned.
 * @param {string} exclude The string of link text to remove.
 * @returns {string} Cleaned html.
 */
function cleanBody(html, exclude){
  html = html.replace(/\r?\n|\r|\t|/g, '');
  var re = '<a\\b[^>]*>('+exclude+')<\\/a>';
  return html.replace(new RegExp(re,'ig'),"");
}

在上面的示例中,我将传递 html 和字符串“一些文本”来删除它。这适用于我的场景,直到包含其他标记,例如

<div>foo bar</div
<a href="http://example.com"><font color="#1122cc">some text</font></a>
<div>foo bar foo bar</div> 

如何改进正则表达式(或函数)以考虑额外的标记(不使用 DOM、jQuery 或其他库)?

【问题讨论】:

  • 为什么 解析器和 DOM 技巧不可能
  • 如何创建一个单独的 div 元素并将其 innerHTML 属性设置为字符串?这对你有用吗?你想定位什么“附加标记”?
  • @MCL 我在 Google Apps 脚本中工作,它使用 JavaScript 语法但执行服务器端 developers.google.com/apps-script
  • HTML 来自哪里?我从未使用过 Google Apps 脚本,但似乎 UrlFetchApp 返回可解析的 HTML。这是example
  • @MCL 来自电子邮件 (GmailService)。我确实考虑过使用 XML.parse 但 cmets 建议 find and replace 对于这种情况更好stackoverflow.com/questions/16687273/…

标签: javascript regex google-apps-script


【解决方案1】:

以下正则表达式应该适用于您提出的具体情况:

var re="<a\\b[^>]*>(<[^>]+>)*("+exclude+")(<(?!/a>)[^>]+>)*</a>";
  • 在开始锚标记匹配之后,添加匹配零个或多个标记的模式,无论它们是开始标记还是结束标记,有效或无效:(&lt;[^&gt;]+&gt;)*
  • 在匹配排除文本之后,添加一个匹配零个或多个标签的模式,无论它们是开始标签还是结束标签,有效或无效,但是 - 使用否定前瞻 - 不匹配结束锚标签:(&lt;(?!/a&gt;)[^&gt;]+&gt;)*

请注意,这个正则表达式在它的工作方式上仍然不是很“聪明”。它不会尝试匹配平衡标签或过滤无效的有效标签名称,因此将匹配以下无效 HTML:

<a href="http://example.com">some text</font></span></div></a>
<a href="http://example.com"><div>some text</font></span></div></a>
<a href="http://example.com"><foo>some text</div></a>

另外,请注意,以下无效的 HTML 仅匹配到结束锚标记

<a href="http://example.com"><div>some text</font></a></div>

关闭的&lt;/div&gt; 将不匹配。

小心嵌套的锚点。以下将匹配(注意只有 一个 闭合锚标记匹配):

<a href="http://foo.org"><a href="http://example.com">some text</a>

可能还有其他数据与我没有想到的这种模式意外匹配。

从好的方面来说,嵌套标签不必包装排除文本。将匹配以下内容:

<a href="http://example.com"><span></span>some text<div></div></a>
<a href="http://example.com">some text<font></font></a>

有一些机会可以使正则表达式更加灵活和/或安全,但这超出了您所要求的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多