8

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:// で始まるようにコールバックを追加し、句読点の処理方法をいじりました。

それはおそらく最善の方法ではありませんが、うまくいきます。この間、これについて多くのことを学びましたが、まだまだ学ぶべきことがあります。

4

4 に答える 4

1

問題は、正規表現で「任意の文字」を意味するドットにある可能性があります。おそらくそれをエスケープする必要があります:

\b(http|www)\.?[^\s]+

次に、疑問符は0または1を意味するため、「オプションのドット」と言いましたが、これは必要なものではありません(右?):

\b(http|www)\.[^\s]+

今、それは一致するだけhttp.www.ので、受け入れる他の文字を指定する必要があります:

\b(http|www)\.[^\s\w]+

また

\b(http|www)\.[^\sa-zA-Z]+

だから今、あなたはこう言っています。

  • 単語の境界で
  • httpまたは_www
  • 点を入れる
  • 任意の範囲a-zまたはA-Zを許可し、空白文字を許可しない
  • それらの1つ以上

注 - 私はこれらをテストしていませんが、うまくいけば正しいようです。


余談ですが(私の見解ですが)、これ\sは「空白」を意味します。は\b「単語境界」を意味します。は[]「許容される文字範囲」を意味します。^は「ない」という意味です。+「一つ以上」という意味です。

したがって、[^\b]+「この範囲の文字には単語の境界を許可しないでください。1 つ以上の境界が必要です」と言っている場合、そこには他に何もないので > 他に何も許可されていません > 1 つ以上はありません > おそらく壊れます.

于 2013-06-05T05:27:40.327 に答える