URL をプレーンテキスト文字列で検索する正規表現を作成して、アンカー タグでラップできるようにしようとしています。この には既に使用可能な式があることは知っていますが、主にそれがどのように機能するかを知りたいため、独自の式を作成したいと考えています。
私の正規表現が失敗しても何も壊れないので、私の計画はかなり単純なものを書くことです。つまり、1) 単語の先頭にある "www" または "http" に一致します。2) 単語が終わるまで一致し続けます。
私はそれを行うことができます、AFAICT。私はこれを持っています:\b(http|www).?[^\s]+
foo www.example.com bar http://www.example.com
などで動作します。
問題は、それをfoo www.example.com, http://www.example.com
指定すると、コンマが URL の一部であると見なされることです。
したがって、これを行うために 1 つの式を使用する場合は、「...空白が表示されたら停止する」を「...空白または空白の直前に句読点が表示されたら停止する」に変更する必要があります。これは、どうすればよいかわかりません。
現時点で考えている解決策は、別のテストを追加することです。URL を照合し、次の行で卑劣な句読点を移動します。これはそれほどエレガントではありません。
注:これはPHPで書いています。
余談ですが、上記の式\s
で withを置き換えると機能しないように見えるのはなぜですか?\b
到着予定時刻:
みんな、ありがとう!
これは、Explosion Pills のアドバイスに基づいて、私が最終的に得たものです。
function add_links( $string ) {
function replace( $arr ) {
if ( strncmp( "http", $arr[1], 4) == 0 ) {
return "<a href=$arr[1]>$arr[1]</a>$arr[2]$arr[3]";
} else {
return "<a href=" . "http://" . $arr[1] . ">$arr[1]</a>$arr[2]$arr[3]";
}
}
return preg_replace_callback( '/\b((?:http|www).+?)((?!\/)[\p{P}]+)?(\s|$)/x', replace, $string );
}
すべてのリンクが http:// で始まるようにコールバックを追加し、句読点の処理方法をいじりました。
それはおそらく最善の方法ではありませんが、うまくいきます。この間、これについて多くのことを学びましたが、まだまだ学ぶべきことがあります。