8

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;
4

2 に答える 2

5

次の正規表現は URL に一致します。

  • (オプション)http://またはhttps://
  • (オプション) サブドメイン ( www.example.comhelp.example.comなど)
  • 1 ~ 3 個のドメイン拡張子があり、それぞれ 2 ~ 6 文字にする必要があります ( www.example.com.guwww.example.com.au.museumなど)。
  • (オプション) 末尾にスラッシュを付ける
  • (オプション) スラッシュの後に有効な文字を使用

/i末尾の により、大文字と小文字が区別されなくなります。

/((http|https):\/\/)?([a-z0-9-]+\.)?[a-z0-9-]+(\.[a-z]{2,6}){1,3}(\/[a-z0-9.,_\/~#&=;%+?-]*)?/is

編集:hrefこれは URL の一部ではなく、リンクの属性に含めるべきではないため、末尾 (文末など) の「ぶら下がっている」ピリオドには一致しません。

編集 2:最初のpreg_replace()で、 に変更$1$0ます。これにより、一致した文字列の一部ではなく、一致した文字列全体が挿入されます。

編集 3: ( Update 2 )最初にhttp://orを確認するより良い方法は次のとおりです。https://

preg_replace("/href='[^h][^t][^t][^p][^s]?[^:]/", "/href='http:\/\/", $string);
于 2012-06-03T23:26:46.360 に答える