好了,没有“额外的库”,而且“快速轻便”,这里给你:
<(?<Tag_Name>(a)|img)\b[^>]*?\b(?<URL_Type>(?(1)href|src))\s*=\s*(?:"(?<URL>(?:\\"|[^"])*)"|'(?<URL>(?:\\'|[^'])*)')
或作为 C# 字符串:
@"<(?<Tag_Name>(a)|img)\b[^>]*?\b(?<URL_Type>(?(1)href|src))\s*=\s*(?:""(?<URL>(?:\\""|[^""])*)""|'(?<URL>(?:\\'|[^'])*)')"
这段代码将标签名(a
或img
)捕获到"Tag_Name"组,URL类型(href
或src
)捕获到"URL_Type"组,URL捕获到"URL"组(我知道,我在命名组时有点创意)。
它处理任意类型的引号("
或'
),即使在URL中的任何引号都应该已经被编码为实体,但它将忽略任何单个转义的引号字符\'
和\"
。
它不会忽略未关闭的标签(因此是格式不正确的HTML),它会查找其中一个标签的开头,例如<a
或img
,然后继续忽略除大于号(>
)之外的所有内容,直到找到匹配的URL类型属性(a
标签的href
和img
标签的src
),然后匹配其内容。然后它退出并不再关心标签的其余部分!
如果您想对此进行详细解释,请告诉我,但是这里是它在这个页面上产生的匹配示例:
<Match> 'Tag' 'URL_Type' 'URL'
---------------------------------------- ----- ---------- -----------------------------
<a href="http://meta.stackoverflow.com" a href http://meta.stackoverflow.com
<a href="/about" a href /about
<a href="/faq" a href /faq
<a href="/" a href /
<a id="nav-questions" href="/questions" a href /questions
...
<img src="/posts/8066248/ivc/d499" img src /posts/8066248/ivc/d499
它找到了总共 140 个标签(我假设其他发布者会稍微增加这个数字)