我一直在使用这个正则表达式(几年前可能在 stackoverflow 上找到)在 PHP 中转换 mailto 标签:
preg_match_all("/<a([ ]+)href=([\"']*)mailto:(([[:alnum:]._\-]+)@([[:alnum:]._\-]+\.[[:alnum:]._\-]+))([\"']*)([[:space:][:alnum:]=\"_]*)>([^<|@]*)(@?)([^<]*)<\/a>/i",$content,$matches);
我通过它$content = '<a href="mailto:name@domain.com">somename@domain.com</a>'
它返回这些匹配的部分:
0 <a href="mailto:name@domain.com">somename@domain.com</a>
1
2 "
3 name@domain.com
4 name
5 domain.com
6 "
7
8 somename
9 @
10 domain.com
示例用法:<a href="send.php?user=$matches[4][0]&dom=$matches[5][0]">ucwords($matches[8][0])</a>
我的问题是,一些链接包含嵌套标签。由于 preg 表达式正在寻找“<”来获取 8、9、10 块,并且嵌套标签将其丢弃......
例子:
<a href="mailto:name@domain.com"><span><b>somename@domain.com</b></span></a>
我需要忽略嵌套标签,只提取“某些名称”部分:
match part 8 = <span><b>
match part 9 = somename
match part 10 = @
match part 11 = domain.com
match part 12 = </b></span>
我试图通过调整让它工作,([^<|@]*)(@?)([^<]*)
但我无法找出正确的语法来匹配或忽略嵌套标签。