在 PHP 中,使用正则表达式提取一串符合条件的数字(连续的6到11位数字),可以按照以下步骤构建正则表达式。

目标是:

  1. 匹配连续的6到11位数字。
  2. 目标数字前后不能有其他数字。

可以使用以下正则表达式:

(?<!\d)\d{6,11}(?!\d)

解释:

  • (?<!\d):负向前瞻,确保目标数字前面没有其他数字(即,前面不是一个数字)。
  • \d{6,11}:匹配连续6到11位数字。
  • (?!\d):负向后瞻,确保目标数字后面没有其他数字(即,后面不是一个数字)。

示例 PHP 代码

<?php
$input = "654654658";  // 目标输入

// 正则表达式
$pattern = '/(?<!\d)\d{6,11}(?!\d)/';

// 查找匹配项
if (preg_match($pattern, $input, $matches)) {
    echo "匹配到的数字是: " . $matches[0];
} else {
    echo "没有匹配到符合条件的数字";
}
?>

说明:

  • preg_match 函数用于匹配目标字符串中的数字。
  • 如果匹配成功,会输出符合条件的数字,否则会输出“没有匹配到符合条件的数字”。

示例:

  • 输入 654654658 会输出 654654658
  • 输入 6546596154984654656746 会输出 "没有匹配到符合条件的数字",因为这个字符串中的数字连续过长,超过了 11 位。

实际应用:匹配出字符串中的电话和微信、QQ

    /**
     * 匹配出字符串中的电话和微信
     * @param $content
     * @return string[] [电话,微信,QQ号]
     */
    public static function matchPhoneWeixin($content)
    {
        // 国内手机号(13568568454)
        $regPhone = '#(?<!\d)(1[3-9][\d]{9})(?!\d).*#'; //不能是电话后面还带数字的情况
        // 国际手机号(+8613568568454 +0086 13568568454)
        $regPhone2 = '#(\+\d{2,5}\s?[\d]{8,11})(?!\d).*#';
        // 微信号(必须以字母或者下划线开头,字母不区分大小写;可使用6-20个字母、数字、下划线和减号或它们的组合; 不支持设置中文)
        $regWeixin = '#([a-zA-Z_][a-zA-Z0-9_\-]{5,20})#';
        // QQ号(要求6-11位)
        $regQQ = '#(?<!\d)([1-9]\d{5,10})(?!\d).*#';
        $phone     = '';
        $weixin    = '';
        $qq        = '';
        $content   = preg_replace('/[\s]+/', '', $content); //去除空格
        if (preg_match($regPhone, $content, $match)) $phone = $match[1];
        if (preg_match($regPhone2, $content, $match)) $phone = $match[1];
        if (preg_match($regWeixin, $content, $match)) $weixin = $match[1];
        if (!$phone && !$weixin && preg_match($regQQ, $content, $match)) {
            if (
                mb_strpos($content, '微信') !== false ||
                mb_strpos($content, '+v') !== false ||
                mb_strpos($content, '+V') !== false ||
                mb_strpos($content, '加v') !== false ||
                mb_strpos($content, '加V') !== false ||
                mb_strpos($content, 'WX') !== false ||
                mb_strpos($content, 'vx') !== false ||
                mb_strpos($content, 'v') !== false ||
                mb_strpos($content, 'V') !== false
            ) {
                //这串数字识别为微信
                $weixin = $match[1];
            } else {
                //20241231,不用匹配为QQ号,容易误抓
                //20250303张老师:启用QQ号匹配,优化一下最大长度11位,提升正确率
                $qq = $match[1];
            }
        }
        return [$phone, $weixin, $qq];
    }

标签: none

添加新评论