我正在研究PHP中类似SSN的数字的自动完成。因此,如果用户搜索“123”,则应找到号码444123555.我想将结果加粗,因此444<b>123</b>555
。然而,我想将其格式化为SSN - 从而创建444-<b>12-3</b>555
。
有没有办法说'把短跑放在第n位后'?因为我不想要第n个字符,只需要第n个数字 - 如果我可以说'在第三个数字和第五个数字之后放一个短划线,忽略非数字字符,如&lt ;,b和&gt;'那将是真棒。这在正则表达式中是可行的吗?
或者是否有一种不同的方法可以逃离我?
答案 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;
?>
很抱歉,但有点模棱两可。