Php 实现web地址正则表达式

Php 实现web地址正则表达式,php,regex,Php,Regex,我在网上发现了以下内容,但在实现时遇到了问题 (http | ftp | https):\/\/[\w\-\\+(\.[\w\-\+)+([\w\-,@?^=%&;:/~\+\\\\\+]*[\w\-\@?^=%&;/~\+\\\\\+] 这就是我想要php做的: 请看以下内容:请看这里:http://www.rocketlanguages.com/spanish/resources/pronunciation_spanish_accents.php 把它变成:看这里: 如果URL很

我在网上发现了以下内容,但在实现时遇到了问题

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

这就是我想要php做的:

请看以下内容:
请看这里:http://www.rocketlanguages.com/spanish/resources/pronunciation_spanish_accents.php

把它变成:
看这里:


如果URL很长,那么a文本将被分解为。。。在中间

我正在使用这个正则表达式,它对我来说工作得很好,如果你想试试这个

(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?
试试这个:

// 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;
}
请注意,如果您使用的是PHP5.2或更低版本,则必须重写
将\u URL\u替换为\u锚定\u标记
,以使用create\u函数而不是闭包。直到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
    );
}
//PHP5.2中没有闭包,必须使用create_函数()
函数将\u URL\u替换为\u锚定\u标记($string,
$length=50,
$elision_字符串=“…”){
$replace_function=创建_函数(
“$matches”,
“return”“;”
);
返回preg_replace_回调(
URL_REGEX,
$replace_函数,
$string
);
}
请注意,我将您找到的URL正则表达式替换为他在评论中提到的DaveRandom页面上链接到的URL正则表达式。更完整的是,事实上,您使用的正则表达式中有一个错误——有几个“/”字符没有转义(在这里:
[\w\-\,@?^=%&;:/~\+\\\\\\\]*[\w\-\\@^=%&;/~\+\\\\\\\\\]
)。此外,它不会检测端口号,如80或8080


希望这能有所帮助。

+1为了正确地阐明这个问题,我不知道为什么重定向到filter-var()的答案被删除了。。。但似乎可以解决问题的第一部分基本上是重复的,但不完全是因为省略号要求:-您会注意到,接受的解决方案中的正则表达式比您建议的要复杂得多@DelPedro我删除了它,因为问题既不是验证URL,也不是提取URL的某些部分,而是从文本块中提取URL并链接它们,而regex实际上是PHP工具箱中唯一的工具。“我没有正确地阅读问题Z”省略号部分可以使用CSS
文本溢出:省略号来处理,而不是在PHP中尝试截断它。这将大大简化代码。我不知道如何在任何文本中间替换URL。
// 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
    );
}