【发布时间】:2012-11-25 18:42:48
【问题描述】:
我正在开发一个正则表达式来匹配所有引号(双 " 和单 ' 类似),它们前面必须有特定字符,并且将在达到相同的引号类型或遇到 HTML 注释时结束 (
游戏规则是:
- HTML 标签名称本身(例如“”)无关紧要;正则表达式仅从 HTML 元素的属性中获取输入(all="of this in bold is the attribute section">)
- 正则表达式必须能够找到单引号 (
') 和双引号 ("),但只有在达到它自己的引号类型 (\1) 时才能转义,HTML commenct (<!--)或输入结束 ($)。 - 如果遇到 HTML 注释,引用将被中断,但仍被视为引用:"works
- 在第一个引号之前只能存在一组特定的字符,遵循以下模式:[^\w!#£¤€´¨-.:]
/[^\w!#£¤€´¨\-.:]('|")(.|\n)*?(\1|<!--|$)/
但是,DISALLOW 区域(在正则表达式中)存在问题。正则表达式永远不应该在这里工作,因为第一个字符是不允许的。
提前感谢您的帮助!
澄清
regexpal.com 上的示例。一切 - 除了 DISALLOW 部分下的内容 - 都是正确的。
期望的结果应该如下。粗体表示使用上面显示的正则表达式匹配。 (许多)HTML cmets 以一致的方式结束 HTML 标签。
允许
禁止
两种报价类型
在 HTML 引用处停止
输入结束
this - 在新的一行 - 仍然是引用的一部分
【问题讨论】:
-
使用否定的lookbehind:
(?<![\w!#£¤€´¨\-.:]) -
如您所知:stackoverflow.com/a/1732454/15394 - 因此将您的 html 解析为 html,然后通过从标签中提取属性值并仅匹配这些值来提取您要查找的数据。更有弹性。
-
@hoaz - Javascript 不支持lookbehinds。
-
regexr.com?332oa 你的问题到底是什么?我已经复制到 RegExr 中,并且更改了一件事(我对 html 注释使用了前瞻,而不是捕获它),但我看不出问题出在哪里......虽然如果你使用粗体表示匹配,那么你有一些不一致的行为 - 为什么 all= 匹配,但 id= 不匹配?
-
@glenatron:我不是要提取 id、class、style、title 或其他属性中的值。这非常简单,尤其是在使用 jQuery 时。
标签: javascript html regex