2

私はこれを調査してきましたが、まだうまくいかなかった2つの関連する回答しか見つかりませんでした。

とりあえず。テキスト内のリンクを見つけて自動リンクしようとしていますが、それらが既にhtmlタグにある場合は自動リンクしません。(< a > < img >) http、https、www などのすべてのリンクをサポートする必要があります。

私は正規表現が苦手ですが、何かをまとめようとしました。

function b($text)
{
   // a more readably-formatted version of the pattern is on http://daringfireball.net/2010/07/improved_regex_for_matching_urls
   $pattern  = '(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))';

   $callback = create_function('$matches', '
       $url       = array_shift($matches);
       $url_parts = parse_url($url);

       $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
       $text = preg_replace("/^www./", "", $text);

       $last = -(strlen(strrchr($text, "/"))) + 1;
       if ($last < 0) {
           $text = substr($text, 0, $last) . "&hellip;";
       }

       return "<a rel="nofollow" href=".$url.">".$text."</a>";
   ');

   return preg_replace_callback($pattern, $callback, $text);
}

function autolink($txt)
{
    return preg_replace_callback('#(?<!href\=[\'"])(https?|ftp|file)://[-A-Za-z0-9+&@\#/%()?=~_|$!:,.;]*[-A-Za-z0-9+&@\#/%()=~_|$]#', 'b', $txt);
}

しかし、運が悪いので、この時点で何をすべきかわかりません。

4

1 に答える 1

5

これを完全に機能させるには、何らかの HTML パーサーが必要です。<script><style>、コメントなど、 URL を含むことができる他のタグ/構文があることに注意してください。

質問の問題を解決する単純な正規表現ソリューションで十分な場合は、次のようなものを使用できます。

function linkify($input){
    $re = <<<'REGEX'
!
    (
      <\w++
      (?:
        \s++
      | [^"'<>]++
      | "[^"]*+"
      | '[^']*+'
      )*+
      >
    )
    |
    (\b https?://[^\s"'<>]++ )
    |
    (\b www\d*+\.\w++[^\s"'<>]++ )
!xi
REGEX;

    return preg_replace_callback($re, function($m){
        if($m[1]) return $m[1];
        $url = htmlspecialchars($m[2] ? $m[2] : "http://$m[3]");
        $text = htmlspecialchars("$m[2]$m[3]");
        return "<a rel='nofollow' href='$url'>$text</a>";
    },
    $input);
}

最初のキャプチャ グループは、HTML タグに一致します。式は、定義されている場合は最初のキャプチャ グループに置き換えられ (変更されていない HTML タグ)、それ以外の場合は 2 番目または 3 番目のキャプチャ グループへのリンクに置き換えられます。

デモ: 入力:

<img src='http://foo'>www.test.com/?x&y

出力:

<img src='http://foo'><a rel='nofollow' href='http://www.test.com/?x&amp;y'>www.test.com/?x&amp;y</a>
于 2013-08-06T09:07:14.910 に答える