2015-04-17 5 views
1

у меня есть несколько сотен специальных шаблонов кода, например:Алгоритм шаблон строки замены (PHP + регулярных выражений)

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

'preg_match' - дорогой звонок. Старайтесь не делать это в цикле. – HamZa

ответ

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 Кроме того, подумайте, как вы можете кэшировать результат, когда ваш код слишком медленный.

+0

спасибо, его телефонные коды, но с разницей (требуется нестандартный формат) – Bogdan

Смежные вопросы