模式字符串替换的算法(php + regexp)

时间:2015-04-17 08:24:29

标签: php algorithm

我有几百个特殊代码模板,例如:

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;
    }
} 

1 个答案:

答案 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上的工具 考虑如何在代码太慢时缓存结果。