我有几百个特殊代码模板,例如:
array(
'mask' => '98-###(###)',
'detect' => '98-\d\d\d(\d\d\d)',
),
...
输入字符串(仅限数字),检测和格式化(将#
替换为输入字符串中的数字)代码的最佳方法是什么?我的algorithm有效,但速度很慢(我需要每个请求的格式代码) - 任何人都可以看到它是如何改进的:
<?php
class PCode
{
private static $vector = array (
0 => array (
'detect' => '247\\d\\d\\d\\d',
'mask' => '+247-####',
), // <<<<< more codes here
);
/**
*
* @param unknown $phs
* @return string
*/
public static function format($phn)
{
$result = $phn;
foreach(self::$vector as $row)
{
if(preg_match('/'.$row['detect'].'/s', $phn))
{
$reverse = array_reverse( str_split($phn) );
$reverseMask = array_reverse( str_split($row['mask']) );
$newresult = array();
$ridx = 0;
foreach($reverseMask as $k)
{
if($k=='#')
{
$newresult[] = $reverse[$ridx];
$ridx++;
}
else
$newresult[] = $k;
}
$result = implode('', array_reverse( $newresult ));
}
}
return $result;
}
}
答案 0 :(得分:0)
$maskes = array(
'\b98-\d{3}\(\d{3}\)\b' => '98-###(###)',
'\b247\d{4}\b' => '+247-####',
);
preg_replace(
array_keys($maskes),
array_values($maskes),
$text
);
但如果您的电话号码存储在数据库中,也许您可以存储该国家/地区。然后,为每个电话号码应用本地化模式。查看http://geonames.org上的工具 考虑如何在代码太慢时缓存结果。