我有一个包含html代码的字符串,如下所示:
...
<a href="../link.png">image link</a>
...
<img src="../image.png" />
...
<pre class="should_not_match">...</pre>
...
我想提取../link.png
中href
的{{1}}以及a
中../image.png
的{{1}}的所有资源路径。现在我有以下代码:
src
输出不仅包括img
,(with-temp-buffer
(insert html-content) ;; html-content is the content mentioned above
(beginning-of-buffer)
(while (re-search-forward "<[a-zA-Z]+[^/>]+[src|href]=\"\\([^\"]+\\)\"[^>]*>" nil t)
(message (match-string 1))
;; more code here
))
,还包括../link.png
,我知道这是因为regexp中的../image.png
不正确(我想匹配{ {1}}或should_not_match
)。然后我使用以下正则表达式:
[src|href]
但它现在返回src
。我也试过以下,但没有运气:
href
那么,什么是正确的正则表达式呢?
提前致谢,
开尔文
修改
受@lawlist的启发,我发现这是因为我需要使用"<[a-zA-Z]+[^/>]+(src|href)=\"\\([^\"]+\\)\"[^>]*>"
转义nil
,因此"<[a-zA-Z]+[^/>]+\\(src|href\\)=\"\\([^\"]+\\)\"[^>]*>"
"<[a-zA-Z]+[^/>]+((src)|(href))=\"\\([^\"]+\\)\"[^>]*>"
"<[a-zA-Z]+[^/>]+(\\(src\\)|\\(href\\))=\"\\([^\"]+\\)\"[^>]*>"
"<[a-zA-Z]+[^/>]+\\((src)|(href)\\)=\"\\([^\"]+\\)\"[^>]*>"
"<[a-zA-Z]+[^/>]+\\(\\(src\\)|\\(href\\)\\)=\"\\([^\"]+\\)\"[^>]*>"
效果很好。
答案 0 :(得分:2)
此特定正则表达式涵盖原始海报示例中的前两项,例如<a href="../link.png">image link</a>
和<img src="../image.png" />
。我认为没有必要排除原始海报示例中的第三项,因为它不包含在以下正则表达式中:
\\(<a href=\"\\|<img src=\"\\)\\(.*\\)\\(\">image link</a>\\|\" />\\)
原始海报的正则表达不包括第一个示例的一部分 - 即,即使我们修复image link</a>
,正则表达式也不会考虑\\(src\\|href\\)
。因此,我的建议是设计一个包含整个html链接的正则表达式。
答案 1 :(得分:0)