URL を文字列のクリック可能なリンクに変換する方法について多くの質問が寄せられていることは承知していますが、探しているものがまったく見つかりませんでした。
次の例のいずれかに一致させて、クリック可能なリンクに変換できるようにしたいと考えています。
http://www.domain.com
https://www.domain.net
http://subdomain.domain.org
www.domain.com/folder
subdomain.domain.net
subdomain.domain.edu/folder/subfolder
domain.net
domain.com/folder
random.stuff.separated.with.periods と一致させたくありません。
編集: これらの URL は、「通常の」テキストのより大きな文字列内にある必要があることに注意してください。たとえば、「Hello! Come check out domain.net!」の「domain.net」と一致させたいとします。
これは、一致する URL に .com、.net、.org、または .edu の後にスラッシュまたは空白が続くかどうかを判断できる正規表現で実現できると思います。ユーザーのタイプミス以外に、有効な URL のいずれかの後に別の URL が続くようなケースは考えられません。
有効なドメイン拡張子が多数あることは認識していますが、すべてをサポートする必要はありません。正規表現で (com|net|org|edu) のようなものを使用して、どちらをサポートするかを選択できます。残念ながら、私はこれを適切に実装する方法をまだ十分に理解していません。
1つ以上のドットで接続され、指定された拡張子の1つで終わり、その後に空白が続く、または1つを含む、ほぼすべてのテキストに基づいてURLに一致できる正規表現(PHPのpreg_replaceで使用するため)を誰かが見つけるのを手伝ってくれることを願っています指定された拡張子の後にスラッシュと場合によってはフォルダーが続きます。
私はいくつかの検索を行いましたが、今のところ探しているものが見つかりません。これに答える SO 投稿が既に存在する場合は、お詫び申し上げます。
前もって感謝します。
--- 編集 3 ---
数日間の試行錯誤と SO の助けを借りて、次のように動作します。
preg_replace_callback('#(\s|^)((https?://)?(\w|-)+(\.(\w+|-)*)+(?<=\.net|org|edu|com|cc|br|jp|dk|gs|de)(\:[0-9]+)?(?:/[^\s]*)?)(?=\s|\b)#is',
create_function('$m', 'if (!preg_match("#^(https?://)#", $m[2]))
return $m[1]."<a href=\"http://".$m[2]."\">".$m[2]."</a>"; else return $m[1]."<a href=\"".$m[2]."\">".$m[2]."</a>";'),
$event_desc);
これは、以下の anubhava のコードの修正版であり、これまでのところ、私が望んでいることを正確に実行しているようです。ありがとう!