3

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 は、「通常の」テキストのより大きな文字列内にある必要があることに注意してください。たとえば、「He​​llo! 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 のコードの修正版であり、これまでのところ、私が望んでいることを正確に実行しているようです。ありがとう!

4

3 に答える 3

4

次の正規表現を使用できます。

#(\s|^)((?:https?://)?\w+(?:\.\w+)+(?<=\.(net|org|edu|com))(?:/[^\s]*|))(?=\s|\b)#is

コード:

$arr = array(
'http://www.domain.com/?foo=bar',
'http://www.that"sallfolks.com',
'This is really cool site: https://www.domain.net/ isn\'t it?',
'http://subdomain.domain.org',
'www.domain.com/folder',
'Hello! You can visit vertigofx.com/mysite/rocks for some awesome pictures, or just go to vertigofx.com by itself',
'subdomain.domain.net',
'subdomain.domain.edu/folder/subfolder',
'Hello! Check out my site at domain.net!',
'welcome.to.computers',
'Hello.Come visit oursite.com!',
'foo.bar',
'domain.com/folder',

);
foreach($arr as $url) {   
   $link = preg_replace_callback('#(\s|^)((?:https?://)?\w+(?:\.\w+)+(?<=\.(net|org|edu|com))(?:/[^\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>";'),
           $url);
   echo $link . "\n";

出力:

<a href="http://www.domain.com/?foo=bar">http://www.domain.com/?foo=bar</a>
http://www.that"sallfolks.com
This is really cool site: <a href="https://www.domain.net">https://www.domain.net</a>/ isn't it?
<a href="http://subdomain.domain.org">http://subdomain.domain.org</a>
<a href="http://www.domain.com/folder">www.domain.com/folder</a>
Hello! You can visit <a href="http://vertigofx.com/mysite/rocks">vertigofx.com/mysite/rocks</a> for some awesome pictures, or just go to <a href="http://vertigofx.com">vertigofx.com</a> by itself
<a href="http://subdomain.domain.net">subdomain.domain.net</a>
<a href="http://subdomain.domain.edu/folder/subfolder">subdomain.domain.edu/folder/subfolder</a>
Hello! Check out my site at <a href="http://domain.net">domain.net</a>!
welcome.to.computers
Hello.Come visit <a href="http://oursite.com">oursite.com</a>!
foo.bar
<a href="http://domain.com/folder">domain.com/folder</a>

PS:この正規表現は、URL で http および https スキームのみをサポートします。たとえば、ftp もサポートしたい場合は、正規表現を少し変更する必要があります。

于 2012-04-11T17:12:52.827 に答える
1
'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/]*/'

それはあなたの例でうまくいきます。最後の括弧内に「-」、「&」、「?」、「:」などの文字サポートを追加したい場合があります。

'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/\?=&-;]*/'

これにより、パラメーターとポート番号がサポートされます。

例: www.foo.ca:8888/test?param1=val1¶m2=val2

于 2012-04-11T17:18:29.150 に答える
0

ありがとうございます。指定されたドメインだけでなく、すべてのドメイン (.ca、.co.uk) を許可するように彼の最終的なソリューションを変更しました。

$html = preg_replace_callback('#(\s|^)((https?://)?(\w|-)+(\.[a-z]{2,3})+(\:[0-9]+)?(?:/[^\s]*)?)(?=\s|\b)#is',
    create_function('$m', 'if (!preg_match("#^(https?://)#", $m[2])) return $m[1]."<a href=\"http://".$m[2]."\" target=\"blank\">".$m[2]."</a>"; else return $m[1]."<a href=\"".$m[2]."\" target=\"blank\">".$m[2]."</a>";'),
    $url);
于 2012-06-21T20:22:39.327 に答える