PHP 関数を使用して、テキスト文字列内の URL を実際のリンクに自動的に変換し、人々がクリックできるようにしています。ほとんどの場合はうまくいくようですが、うまくいかないケースもいくつか見つかりました。
私は正規表現をまったく理解していないので、誰かがこれで私を助けてくれることを望んでいました.
私が現在使用しているパターンは次のとおりです。
$pattern = "/(((http[s]?:\/\/)|(www\.))(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+(\.[a-z]{2,2})?)\/?[a-z0-9.,_\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is";
ただし、このパターンが一致しないことがわかったいくつかのリンクを次に示します。
- www.oakvilletransit.ca - 確かではありませんが、国コードが 2 文字であるため一致しないと想定しています
- www.grt.ca - 動作していない .ca ドメインを持つ別のもの
- 他のいくつかの .ca アドレス
- freepublictranssports.com - www なしのアドレス。または http:// それらの前に。これらも同様に機能することを望みます。
- www.222tips.com - アドレスの先頭に数字があるため、一致しないと仮定します。
これらのケースにも一致するようにその正規表現パターンを変更する方法を知っている人はいますか?
編集- 最後にピリオドがある可能性のある URL にも一致する必要があります。URL が文の最後の部分である場合、実際のリンクに含まれてはならないピリオドが末尾にある場合があります。現在、このパターンはそれも考慮しています。
EDIT 2 - 私はこのようなパターンを使用しています:
$pattern = "/((http|https):\/\/)?([a-z0-9-]+\.)?[a-z][a-z0-9-]+(\.[a-z]{2,6}){1,3}(\/[a-z0-9.,_\/~#&=;%+?-]*)?/is";
$string = preg_replace($pattern, " <a target='_blank' href='$1'>$1</a>", $string);
// fix URLs without protocols
$string = preg_replace("/href='www/", "href='http://www", $string);
return $string;