我该如何匹配
<a href="logout.html">Logout</a>
这个
<a href='logout.html'>Logout</a>
编辑(并捕获 logout.html 和注销)
但不这个:
<a href="'.$var.'">'.$another_var.'</a>
现在我有了这个
"^.*<a.*href=\"\\([^\"]+\\)\"[^>]+>\\([^<]+\\)</a>"
但它只匹配双引号,并且也接受变量链接......
答案 0 :(得分:2)
Avinash Raj解决引用问题的方法是可行的/更安全的:
<a .*?\bhref=\(['"]\)[^'"]*\1.*?>.*?</a>
作为字符串:
"<a .*?\\bhref=\\(['\"]\\)[^'\"]*\\1.*?>.*?</a>"
n.b。不要使用贪婪的操作员,这样做是不安全的!例如:<a.*href
是一个相当糟糕的主意。
编辑:所以事实证明你只需要来自匹配的URL和链接文本,在这种情况下你会在那些附加组附加其他组:
"<a .*?\\bhref=\\(['\"]\\)\\([^'\"]*\\)\\1.*?>\\(.*?\\)</a>"
然后询问第2组和第2组匹配的字符串3。
在elisp中,您最有可能使用(match-string 2)
&amp; (match-string 3)
,但这取决于您使用正则表达式的方式。
另请注意,正则表达式无法匹配平衡表达式,因此在这种情况下,它们始终无法提供完美的解决方案,并且您依赖于对数据的假设你正在处理。如果您的URL包含引号,则此正则表达式将失败。
当然,elisp通常对处理平衡表达式有很多支持,所以你可能会以更基本的形式匹配元素,然后使用forward-sexp
从开头报价转到结束报价。更可靠的方式。显然,这个问题超出了这个问题的范围。
编辑2:显然我实际上必须证明这一点。
与我原来的正则表达式之间的唯一区别是添加了额外的组,因为您后续编辑了问题。
答案 1 :(得分:1)
答案 2 :(得分:1)