0

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>

ネストされたタグを無視して、"some name" 部分だけを抽出する必要があります。

match part 8 = <span><b>
match part 9 = somename
match part 10 = @
match part 11 = domain.com
match part 12 = </b></span>

微調整して機能させようとしましたが([^<|@]*)(@?)([^<]*)、ネストされたタグに一致または無視する正しい構文がわかりません。

4

4 に答える 4