【问题标题】:Use regex to find specific string not in html tag使用正则表达式查找不在 html 标记中的特定字符串
【发布时间】:2010-10-31 18:44:52
【问题描述】:

我在尝试使用特定的正则表达式时遇到了一些困难。我正在搜索文档中每个出现的字符串(出于我的目的,我会说它是“mystring”),除了它在标签中的位置,例如

<a href="_mystring_">

不应该匹配,但是

<a href="someotherstring">_mystring_</a>

应该匹配,因为它不在标签内(内部意思是“在 标记内”)我也在使用 .NET 的正则表达式函数。

【问题讨论】:

  • 你的意思是你的第二个例子应该匹配吗?
  • [在此处插入强制性“不要使用正则表达式解析 HTML”答案]
  • robbotic:不,应该匹配。它不在 标记内。我需要在 mystring 上进行替换,但不是当它是标签的一部分时,因为它在顶部示例中。此外,将其加载到 XDocument 或在我的情况下实际上不可行的任何内容中。
  • 我也尝试将字符串加载到 XML 文档中,但因为大多数情况下它们不符合规范(未正确关闭、缺少一两个标签等)我不能用

标签: .net html regex


【解决方案1】:

应该这样做:

(?<!<[^>]*)_mystring_

它使用负向查找来检查匹配的字符串是否在其前面没有

【讨论】:

  • 虽然我需要在后视中添加更多规则,以满足我的特定需求,但这就是让事情为我工作的原因。谢谢!
  • 哇,这是一个漂亮的正则表达式! @Sukasa,你能发布你想出的最后一个吗?
  • 这在 js 中不起作用。 js中不支持look behind。你可以为js推荐它吗?
【解决方案2】:

当你的正则表达式处理器不支持变长后看时,试试这个:

(<.+?>[^<>]*?)(_mystring_)([^<>]*?<.+?>)

保留捕获组 1 和 3 并替换捕获组 2:

例如,在 Eclipse 中,查找:

(<.+?>[^<>]*?)(_mystring_)([^<>]*?<.+?>)

并替换为:

$1_newString_$3

(其他正则表达式处理器可能使用不同的捕获组语法,例如 \1)

【讨论】:

  • 这是您需要在 PHP 中使用的答案,我最终发现...
【解决方案3】:

另一个对我有用的搜索正则表达式

(?![^<]*>)_mystring_

来源:https://stackoverflow.com/a/857819/1106878

【讨论】:

    【解决方案4】:

    一个快速而肮脏的替代方法是使用带有回调的正则表达式替换函数来编码标签的内容(之间的所有内容),例如使用base64,然后运行您的搜索,然后运行另一个回调来解码您的标签内容.

    当您需要从正则表达式搜索中排除特定标签时,这也可以省去很多麻烦 - 首先将它们混淆并将它们包装在与您的搜索不匹配的标记中,然后运行您的搜索,然后对标记中的任何内容进行去混淆处理。

    【讨论】:

      【解决方案5】:

      为什么要使用正则表达式?

      对于 xhtml,将其加载到 XDocument / XmlDocument 中;对于(非 x)html,Html Agility Pack 似乎是一个更明智的选择......

      无论哪种方式,这都会将 html 解析为 DOM,以便您可以遍历节点并检查它们。

      【讨论】:

      • 这可以处理任何格式错误的 HTML 吗?这种事情通常是在所见即所得编辑器中生成的 HTML 上执行的(至少对于我们的例子而言)——因此永远无法保证标记的完整性。
      • @benjaminhull 试图处理格式错误的内容只是......混乱;很少有工具可以帮助您,因为很难安全地自动化
      【解决方案6】:

      忽略确实有其他方法,而且我不是真正的正则表达式专家,但突然出现在我脑海中的一件事是:

      • 首先找到所有在标签中的 mystring - 因为我不能编写表达式来做相反的事情:)
      • 将这些更改为其他内容
      • 然后根据需要替换所有其他 mystring(不在标签中)
      • 恢复标签中的原始mystring

      因此,使用&lt;[^&gt;]*?(mystring)[^&gt;]*&gt; 您可以找到标记的那些。将它们替换为 otherstring。您是否在剩下的 mystring 上正常替换。将 otherstring 替换回 mystring

      粗鲁但有效....也许吧。

      【讨论】:

        【解决方案7】:
        _mystring_(?![^<]*?>)
        

        但需要有效的 HTML 结构。

        【讨论】:

          【解决方案8】:

          正则表达式搜索在 XML 中通常不是一个好主意。搜索表达式匹配太多或太少太容易遇到问题。也几乎不可能制定一个能够正确识别和处理 XML 允许的 CDATA 部分、处理指令 (PI) 和转义序列的正则表达式。

          除非您完全控制所获得的 XML 内容并且可以保证它不会包含此类结构(并且不会更改),否则我建议您使用某种 XML 解析器(XDocument 或 XmlDocument in .网络,例如)。

          话虽如此,如果您仍然打算使用正则表达式作为您的搜索机制,那么在 .NET 中使用 RegEx 类应该可以使用类似下面的内容。您可能想在Regexlib 之类的站点上使用您自己的一些测试用例来test it out。您还可以搜索他们的正则表达式目录以找到可能满足您需求的内容。

          [>].(_mystring_).[

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-14
            • 2018-08-08
            相关资源
            最近更新 更多