PHP如何从含verify链接的字符串中提取可变长度数字?
如何从包含特定链接的字符串中提取动态数字?
假设我有这样一个包含链接的字符串:
$message = 'Text before link ... www.website.com/verify/12345/ ... text after link.';
已经通过if(str_contains($message, 'verify'))确认字符串里包含verify,现在需要提取其中的数字12345,这个数字可以是任意长度的其他数字。
我自己想了一种思路:先提取完整链接,用/分割后取数组末尾或倒数第二个元素,但有两个疑问:
- 有没有更高效直接的提取数字的方法?
- 如果没有更优方法,怎么从长字符串里高效获取包含
verify的完整链接?
我试过用空格分割整个字符串后遍历找含verify的元素,但长字符串下效率不高;也试过substr($message, mb_strpos($message, 'verify') + 7, $length_of_number);,但数字长度不固定,没法确定$length_of_number的值。
1. 更优的数字提取方法:直接用正则表达式一步到位
不需要先提取完整链接,直接用正则匹配verify/后面的连续数字即可,这是最直接高效的方式:
$message = 'Text before link ... www.website.com/verify/12345/ ... text after link.'; if (str_contains($message, 'verify')) { // 正则匹配:定位verify/后面的连续数字 if (preg_match('/verify\/(\d+)/', $message, $matches)) { $targetNumber = $matches[1]; // 此处得到目标数字12345 echo $targetNumber; } }
- 正则说明:
verify\/匹配固定字符串verify/(/需要转义),(\d+)捕获一个或多个连续数字,结果会存入$matches数组的第1位。 - 优势:跳过额外的链接拆分步骤,直接定位目标数字,长字符串下性能更优。
2. 若要先提取包含verify的完整链接:用正则匹配链接边界
如果一定要先拿到完整链接,可以用正则匹配从链接起始标识(如www.)到分隔符(如空格、标点)的完整内容,同时确保包含verify:
if (str_contains($message, 'verify')) { // 匹配包含verify的完整链接(适配以www.开头的链接,以非空白字符结束) if (preg_match('/(www\.[^\s]+verify[^\s]+)/', $message, $matches)) { $fullLink = $matches[1]; // 得到www.website.com/verify/12345/ // 分割链接提取数字 $parts = explode('/', $fullLink); foreach ($parts as $part) { if (ctype_digit($part)) { $targetNumber = $part; break; } } echo $targetNumber; } }
- 正则说明:
www\.匹配链接开头,[^\s]+匹配非空白字符(直到遇到空格或其他分隔符),确保中间包含verify,精准锁定目标链接。 - 适配调整:如果链接可能以
http://或https://开头,可将正则改为/(https?:\/\/[^\s]+verify[^\s]+)/。
内容的提问来源于stack exchange,提问作者eligolf
相关产品推荐
相关产品推荐

