正则表达式 - 匹配除 <a ... > 之外的所有 "(引号)

Regex - match all " (quotes) except in <a ... >

我想在文本中找到所有 " - 引号(只是字符)以将其替换为 &quot;。在某些文本中也有 a-tags。为了保持 a-tag 的功能,我不不想替换开头 a-tag 中的 "。

我尝试了以下方法,但它也与标签中的匹配:

(?!<a.*(").*>)"

https://regex101.com/r/eyEF5K/2/

在任何人决定在生产中实施它之前,请先查看 this post。 HTML 和正则表达式不能很好地混合,所以请不要使用这个答案,除非你正在尝试做一个快速的破解。

要替换 " 的所有实例,但 <a> 标签内的实例除外,您可以使用以下内容。当然,这假设字符 > 在标签中无效(例如 <a param='>' href=""> 打破了这个)。

此外,取决于您的正则表达式引擎。例如,这在 PCRE 中有效(以及其他),但您没有指定语言,所以我假设 一切正常

See regex in use here

<a[^>]*>(*SKIP)(*FAIL)|"

它的工作原理如下:

  • 符合以下任一选项
    • <a[^>]*>(*SKIP)(*FAIL)匹配以下
      • <a 字面匹配
      • [^>]* 匹配除 > 之外的任何字符任意次数
      • > 按字面匹配此字符
      • (*SKIP)(*FAIL) 魔法 - 请参阅 this post 了解更多信息。基本上允许您使用字符,然后将它们从匹配中排除。
    • " 字面匹配

我们有效地匹配了所有 " 但跳过了匹配模式中的所有 <a ... > 标签。

这是 PCRE 特定的,每个匹配项都是这些实体之一 [<>"&']
不存在于 任何 标签或脚本等不可见内容中。
它使用 (*SKIP)(*FAIL) 动词组合绕过所有标签。

如果您只是想要双引号,请将 class 更改为 ["]

(?:<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>(*SKIP)(*FAIL)|[<>"&'])

看这里的例子 -> https://regex101.com/r/OPsM1K/1

在非 PCRE 类型的引擎上,通过删除动词来改变正则表达式,捕获(匹配)两者
不同组中的标签和实体。
这是一种绕过标签同时匹配实体的被动方式。
它需要使用回调功能进行搜索或替换以确定哪个组
匹配并相应地采取行动。
(此正则表达式未显示,如果需要我会包含它)。