5

以下をオンラインで見つけましたが、実装に問題があります

(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?

これは私がphpにやりたいことです:

次のようにします。Look here: http://www.rocketlanguages.com/spanish/resources/pronunciation_spanish_accents.php

そしてそれを次のように変えます:Look here: <a href="http://www.rocketlanguages.com/spanish/resources/pronunciation_spanish_accents.php">http://www.rocketlanguages.com/span...anish_accents.php</a>

URL が長い場合、テキストは途中で ... で分割されます

4

2 に答える 2

1

これを試して:

// URL regex from here:
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
define( 'URL_REGEX', <<<'_END'
~(?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`!()\[\]{};:'".,<>?«»“”‘’]))~
_END
);

// PHP 5.3 or higher, can use closures (anonymous functions)
function replace_urls_with_anchor_tags( $string,
                                        $length = 50,
                                        $elision_string = '...' ) {
    $replace_function = function( $matches ) use ( $length, $elision_string) {
        $matched_url = $matches[ 0 ];
        return '<a href="' . $matched_url . '">' .
                abbreviated_url( $matched_url, $length, $elision_string )   .
                '</a>';
    };
    return preg_replace_callback(
        URL_REGEX,
        $replace_function,
        $string
    );
}

function abbreviated_url( $url, $length = 50, $elision_string = '...' ) {
    if ( strlen( $url ) <= $length ) {
        return $url;
    }
    $width_either_side = (int) ( ( $length - strlen( $elision_string ) ) / 2 );
    $left  = substr( $url, 0, $width_either_side );
    $right = substr( $url, strlen( $url ) - $width_either_side );

    return $left . $elision_string . $right;
}

(URL_REGEX 定義のバックティックは、stackoverflow.com の構文強調表示を混乱させますが、心配する必要はありません)

この関数replace_urls_with_anchor_tagsは文字列を受け取り、一致するすべての URL をアンカー タグに変更し、省略記号で省略して長い URL を短縮します。この関数は、長さをいじって楕円を別のものに変更したい場合に備えて、オプションlengthと引数を取ります。elision_string

使用例を次に示します。

// Test it out
$test = <<<_END
Look here:
http://www.rocketlanguages.com/spanish/resources/pronunciation_spanish_accents.php

And here:
http://stackoverflow.com/questions/12385770/implementing-web-address-regular-expression
_END;

echo replace_urls_with_anchor_tags( $test, 50, '...' );
// OUTPUT:
// Look here:
// <a href="http://www.rocketlanguages.com/spanish/resources/pronunciation_spanish_accents.php">http://www.rocketlangua...ion_spanish_accents.php</a>
//
// And here:
// <a href="http://stackoverflow.com/questions/12385770/implementing-web-address-regular-expression">http://stackoverflow.co...ress-regular-expression</a>

PHP 5.2 以下を使用している場合はreplace_urls_with_anchor_tags、クロージャの代わりに create_function を使用するように書き直す必要があることに注意してください。クロージャは PHP 5.3 まで導入されませんでした:

// No closures in PHP 5.2, must use create_function()
function replace_urls_with_anchor_tags( $string,
                                        $length = 50,
                                        $elision_string = '...' ) {
    $replace_function = create_function(
        '$matches',
        'return "<a href=\"$matches[0]\">" .
                abbreviated_url( $matches[ 0 ], '            .
                                 $length  . ', '             .
                                 '"' . $elision_string . '"' .
                               ') . "</a>";'
    );
    return preg_replace_callback(
        URL_REGEX,
        $replace_function,
        $string
    );
}

あなたが見つけた URL regex を、DaveRandom がコメントで参照したページにリンクされているものに置き換えたことに注意してください。それはより完全であり、実際、使用していた正規表現には実際に間違いがあります-いくつかの「/」文字がエスケープされていません(ここでは: [\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])。また、80 や 8080 などのポート番号も検出しません。

お役に立てれば。

于 2012-09-17T05:59:20.690 に答える
0

この正規表現を使用していますが、問題なく動作しています。必要に応じてこれを試してください

(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?
于 2012-09-12T10:21:48.017 に答える