把东西放在第n个数字之后,而不是第n个字符?

时间:2011-08-10 16:03:15

标签: php regex

我正在研究PHP中类似SSN的数字的自动完成。因此,如果用户搜索“123”,则应找到号码444123555.我想将结果加粗,因此444<b>123</b>555。然而,我想将其格式化为SSN - 从而创建444-<b>12-3</b>555

有没有办法说'把短跑放在第n位后'?因为我不想要第n个字符,只需要第n个数字 - 如果我可以说'在第三个数字和第五个数字之后放一个短划线,忽略非数字字符,如&lt ;,b和&gt;'那将是真棒。这在正则表达式中是可行的吗?

或者是否有一种不同的方法可以逃离我?

4 个答案:

答案 0 :(得分:4)

只需遍历字符串并检查每个字符是否为数字,并在计算时计算数字。

这将比正则表达式快得多,即使正则表达式是一个可行的解决方案(我不相信它)。

答案 1 :(得分:1)

这将完全符合您的要求:

$str = preg_replace('/^ ((?:\D*\d){3}) ((?:\D*\d){2}) /x', '$1-$2-', $str);

(?:\D*\d)将匹配任意数量的非数字,然后是数字。通过重复n次,你匹配n个数字,“忽略”其他一切。

答案 2 :(得分:1)

这是一个使用迭代方法的简单函数,如Platinum Azure建议:

function addNumberSeparator($numString, $n, $separator = '-')
{
    $numStringLen = strlen($numString);

    $numCount = 0;
    for($i = 0; $i < $numStringLen; $i++)
    {
        if(is_numeric($numString[$i]))
        {
            $numCount++;
            //echo $numCount . '-' . $i;
        }

        if($numCount == $n)
            return substr($numString, 0, $i + 1) . $separator .     substr($numString, $i + 1);
    }
}

$string = '444<b>123</b>555';

$string = addNumberSeparator($string, 3);
$string = addNumberSeparator($string, 5);

echo $string;

这输出以下内容:

4x<b>x123</b>555

当然,这只能使用非数字分隔符。不是最优秀的代码,但它应该给你一个开始!

希望有所帮助。

答案 3 :(得分:0)

如果您想获取格式化数字和周围文字:

<?php
preg_match("/(.*)(\d{3})(12)(3)(.*)/", "assd444123666as555", $match);
$str = $match[1];
if($match[2]!=="") $str.=$match[2]."-<b>";
$str.=$match[3]."-".$match[4]."</b>";
if($match[5]!=="") $str.=$match[5];
echo $str;
?>

如果只是格式化数字:

<?php
preg_match("/(.*)(\d{3})(12)(3)(.*)/", "as444123666as555", $match);
$str = "";
if($match[2]!=="") $str.=$match[2]."-<b>";
$str.=$match[3]."-".$match[4]."</b>";
echo $str;
?>

很抱歉,但有点模棱两可。