正则表达式 - 匹配除 <a ... > 之外的所有 "(引号)
Regex - match all " (quotes) except in <a ... >
我想在文本中找到所有 " - 引号(只是字符)以将其替换为 "
。在某些文本中也有 a-tags。为了保持 a-tag 的功能,我不不想替换开头 a-tag 中的 "。
我尝试了以下方法,但它也与标签中的匹配:
(?!<a.*(").*>)"
在任何人决定在生产中实施它之前,请先查看 this post。 HTML 和正则表达式不能很好地混合,所以请不要使用这个答案,除非你正在尝试做一个快速的破解。
要替换 "
的所有实例,但 <a>
标签内的实例除外,您可以使用以下内容。当然,这假设字符 >
在标签中无效(例如 <a param='>' href="">
打破了这个)。
此外,取决于您的正则表达式引擎。例如,这在 PCRE 中有效(以及其他),但您没有指定语言,所以我假设 一切正常。
<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 类型的引擎上,通过删除动词来改变正则表达式,捕获(匹配)两者
不同组中的标签和实体。
这是一种绕过标签同时匹配实体的被动方式。
它需要使用回调功能进行搜索或替换以确定哪个组
匹配并相应地采取行动。
(此正则表达式未显示,如果需要我会包含它)。
我想在文本中找到所有 " - 引号(只是字符)以将其替换为 "
。在某些文本中也有 a-tags。为了保持 a-tag 的功能,我不不想替换开头 a-tag 中的 "。
我尝试了以下方法,但它也与标签中的匹配:
(?!<a.*(").*>)"
在任何人决定在生产中实施它之前,请先查看 this post。 HTML 和正则表达式不能很好地混合,所以请不要使用这个答案,除非你正在尝试做一个快速的破解。
要替换 "
的所有实例,但 <a>
标签内的实例除外,您可以使用以下内容。当然,这假设字符 >
在标签中无效(例如 <a param='>' href="">
打破了这个)。
此外,取决于您的正则表达式引擎。例如,这在 PCRE 中有效(以及其他),但您没有指定语言,所以我假设 一切正常。
<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 类型的引擎上,通过删除动词来改变正则表达式,捕获(匹配)两者
不同组中的标签和实体。
这是一种绕过标签同时匹配实体的被动方式。
它需要使用回调功能进行搜索或替换以确定哪个组
匹配并相应地采取行动。
(此正则表达式未显示,如果需要我会包含它)。