【问题标题】:Regex formula for all text including inside HTML tags, but not in 'a' tags所有文本的正则表达式公式,包括 HTML 标签内,但不在“a”标签中
【发布时间】:2019-07-14 22:17:02
【问题描述】:

我正在努力使用公式替换字符串中的文本,同时查看除“a”标签(链接)之外的所有标签。

这是我目前的公式:

\b(?<!-)text\b(?<!<[^<>]*)(?!-|[^<>]*>)

例如,我只想替换 'a' 标记之外的 'text' 实例,所以在 'p' 和 'li' 标记内:

<p>
    Some text here. <a href="#">Some more text</a>
    <ul>
        <li>Other text</li>
    </ul>
</p>

它还必须匹配整个单词,包括破折号,该公式目前可以成功地做到这一点。它也(我相信)不会替换标签本身的任何内容,即:

<li class="text">here some text</li>

它不会替换类名中的“文本”。

【问题讨论】:

  • 使用正则表达式可能不是一个好主意:stackoverflow.com/questions/1732348/…
  • 不同的(比如li)标签insidea标签中的文本怎么样?
  • a 标签内的任何东西,即使是嵌套的,都应该被忽略@MetaColon
  • 您的公式基于哪种正则表达式?在regex101.com 上,PCRE、ECMAScript、Python 和 Golang 都有错误(所以基本上每种风格)。
  • 但直觉上在我看来这超出了常规语言的范围,因为你必须知道你的嵌套有多深,以确保你在所有a之外标签。我想这应该不是问题,因为您很少会嵌套a 标签,但您应该注意不完美的解决方案

标签: .net regex


【解决方案1】:

这个公式应该做你想做的:

(?:\A|<\/a>)(?:[^<]|<[^a])*?(text)

匹配的结果(在这种情况下表示文本)存储在匹配的相应组(1)中。但是请注意,如果链接中有链接(如 cmets 中所述),或者文档中有奇怪的字符串,这确实会失败。另请注意,这仅匹配链接外部区域中的第一个匹配项 - 如果要替换某些内容,则必须多次运行该表达式。如果您在此类区域中最多只出现 2 次 text,则可以将此查询与此查询结合使用:

(?:\A|<\/a>)(?:[^<]|<[^a])*(text)

匹配最后一个文本。

我知道这不是最佳解决方案,因此我愿意接受改进建议。但是,我不确定 Regex 是否是这里的最佳解决方案(正如 Yunnosch 指出的那样),因为 Regex 的功能有限(毕竟,它是一种 type-3 语法)。

让我解释一下公式:

  • (?:\A|&lt;\/a&gt;) 匹配输入的开头或链接的结尾
  • (?:[^&lt;]|&lt;[^a])* 匹配所有不是标记指示的内容,或者 - 如果是 - 如果它至少不是链接的开始
  • ? 尽可能少匹配(因此是第一个匹配)
  • (text)匹配实际文本(并保存在组中)

您可以使用$1 或/1 等方式访问这些组,具体取决于您的环境。

【讨论】:

  • 感谢您的回复。它似乎不起作用 - 使用我发送的 regexstorm 链接进行测试,它突出显示的不仅仅是“文本”——当使用“hello text here”时,它会突出显示“hello text”,我认为它只是从一开始字符串
  • @Benjo 突出显示更多,因为相关部分(文本)在组中。由于常规语言(方式)不如上下文敏感语言强大,因此我认为这是不可能的。不过,您应该仍然能够解决使用这种方法遇到的任何问题。
  • @Benjo 请注意,链接中的 table 选项对于查看此内容很有用(尤其是表格的最后一列)
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
相关资源
最近更新 更多