JavaScript正则表达式中的前瞻

3
使用 JavaScript,我正在尝试替换 HTML 标签内的属性,并想到了这个正则表达式:
/<\s*tag[^>]*(attr)=['"]{1,1}([^'"\s]*)['"]{1,1}/ig;

这个方法可行。但是,我想指定查找用于封闭属性值的相同类型的引号。例如,如果这是表单 <tag attr='data'>,我想指定在第二个引号中查找单引号,而不是双引号。反之亦然,<tag attr="data"> 的情况类似;匹配第二个双引号,而不是单引号。这有助于保护函数调用免受奇怪形式的HTML攻击。
那么,我该如何实现呢?
谢谢!

1
使用DOM会更合理吧? - Sean Bright
2个回答

4

试试这个:

/<tag[^>]*attr=(['"])(?:(?!\1)\S)*\1/ig;

解释:

<tag     # Match <tag (\s* is not needed since whitespace is illegal here)
[^>]*    # Match any non-> characters
attr=    # Match "attr="
(['"])   # Match a quote, remember which kind; {1,1} can be dropped (it's a no-op)
(?:      # Try to match
 (?!\1)  #  (unless it's the corresponding closing quote)
 \S      #  any non-whitespace character
)*       # any number of times
\1       # Match the corresponding closing quote

1
太棒了。谢谢你的解释!这真的让我更好地理解,这样我就可以学习如何将其融入其他正则表达式中。 - Juan Carlos Coto

1

试试这个:

/<\s*tag[^>]*(attr)=(['"]{1,1})([^'"\s]*)\2{1,1}/ig;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接