gpt4 book ai didi

php - 实现网址正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:48:18 26 4
gpt4 key购买 nike

我在网上找到了以下内容,但我无法实现它

(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 很长,则文本会在中间用 ... 分解

最佳答案

试试这个:

// 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 更改为 anchor 标记,通过省略号来缩短长 URL。该函数采用可选的 lengthelision_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 正则表达式替换为链接到 DaveRandom 在他的评论中提到的页面上的正则表达式。它更完整,事实上,您使用的正则表达式实际上存在错误——几个“/”字符没有转义(在这里:[\w\-\.,@?^=% &:/~\+#]*[\w\-\@?^=%&/~\+#])。此外,它不会检测端口号,如 80 或 8080。

希望这对您有所帮助。

关于php - 实现网址正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12385770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com