やりたいこと
PHPで文字列の中に含むURLをaタグリンクに置換したい
ただし、既にaリンクである場合は無視したい
ベースコード
こちらを参考にしました。
php
1function url2link($body, $link_title = null) 2{ 3 $pattern = '/(?<!href=")https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+/'; 4 $body = preg_replace_callback($pattern, function($matches) use ($link_title) { 5 $link_title = $link_title ?: $matches[0]; 6 return "<a href=\"{$matches[0]}\">$link_title</a>"; 7 }, $body); 8 return $body; 9}
問題
下記のように、コンテンツ部分にURLが含まれる場合はコンテンツ部分もaタグに置換されてしまいます。
html
1 2#OK 3テストhttps://example.comテスト 4↓ 5テスト<a href="https://example.com">https://example.com</a>テスト 6 7#OK 8テスト<a href="https://example.com">コンテンツ</a>テスト 9↓ 10テスト<a href="https://example.com">コンテンツ</a>テスト 11 12#NG 13テスト<a href="https://example.com">https://example.com</a>テスト 14↓ 15テスト<a href="https://example.com"><a href="https://example.com">https://example.com</a></a>テスト 16 17
試したこと
URL + **<**にはマッチしないように (?!<) を追加してみましたが、
結果が期待と異なります。
php
1$pattern = '/(?<!href=")https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+(?!<)/'; 2 3//結果 <a href="https://example.com"><a href="https://example.co">https://example.co</a>m</a>
正規表現が間違っているか、
そもそも** preg_replace_callback **の挙動認識が間違っているかのどちらかだと思いますが、
解決に向けてアドバイスいただけないでしょうか。
また、上記が解決したとしても「URL + <」は不完全な気がします。。
(<a href="http://-"><p>http://-</p></a>などに対応できない)
抜本解決的にも他の手法がありましたらご教示お願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/13 00:16
退会済みユーザー
2020/08/19 15:57