1

Я пытаюсь найти числа в строке, появляющейся после определенных слов, и размещать ведущие нули перед номерами.Как я могу найти строку на основе определенных критериев и заменить определенное значение с помощью regex

например. Apt 4, John Ave должен быть Apt 0004, John Ave Block 52, Lane Drive должен быть Блок 0052 Lane Drive

Примечание: Я только хочу добавить ведущих 0, чтобы сделать его 4-значный номер

Мой код частично работает, но он заменяет все числа, которые он находит с ведущими нулями. Я думаю, что preg_replace сможет добиться этого с лучшими результатами.

$s = '23 St John Apt 92 rer 4, Wellington Country Block 5 No value test 54545 tt 232'; 


preg_match_all('/Apartment\s[0-9]+|Apt\s[0-9]+|Block\s[0-9]+|Department\s[0-9]+|Lot\s[0-9]+|Number\s[0-9]+|Villa\s[0-9]+/i', $s, $matches); 

var_dump ($matches); 

foreach($matches[0] as $word) 
{ 
    preg_match_all('!\d+!', $word, $matches2); 

    foreach($matches2[0] as $value) 
    { 
     $value = trim($value); 

     if(strlen($value) == 1) 
     { 
      $s= str_replace($value, "000".$value, $s); 
     } 
     else if(strlen($value) == 2) 
     { 
      $s= str_replace($value, "00".$value, $s); 
     } 
     else if(strlen($value) == 3) 
     { 
      $s= str_replace($value, "0".$value, $s); 
     } 
     else 
     { 
      //nothing 
     } 
    } 
} 


echo $s; 
+0

Вы хотите добавить '0' только для того, чтобы сделать их ** четырехзначным числом? –

+1

Да, я хочу добавить только 0, чтобы сделать его 4-значным числом. – user2635901

ответ

1

Вы можете использовать str_pad функцию:

Pad строку до определенной длины с другой строкой

Код:

$re = '/\b((?:Apartment|Apt|Block|Department|Lot|Number|Villa)\s*)([0-9]+)/i'; 
$str = "23 St John Apt 92 rer 4, Wellington Country Block 5 No value test 54545 tt 232"; 
$result = preg_replace_callback($re, function($m){ 
    return $m[1] . str_pad($m[2],4,"0", STR_PAD_LEFT); 
    }, $str); 
echo $result; // <= 23 St John Apt 0092 rer 4, Wellington Country Block 0005 No value test 54545 tt 232 

См demo

В начале я также добавил границу слова \b, чтобы убедиться, что мы сопоставляем только целые слова и немного оптимизировали регулярное выражение.

+0

Ваше решение намного лучше. – user2635901

1

Я понял ответ. Вместо этого я использовал preg_replace_callback.

echo preg_replace_callback("/Apartment\s[0-9]+|Apt\s[0-9]+|Block\s[0-9]+|Department\s[0-9]+|Lot\s[0-9]+|Number\s[0-9]+|Villa\s[0-9]+/i", 
       function($matches){ 
        $word = explode(" ", $matches[0]); 
        $value = $word[1]; 

        var_dump($word); 

        if(strlen($value) == 1) 
        { 
         return $word[0]. " 000".$value; 
        } 
        else if(strlen($value) == 2) 
        { 
         return $word[0]. " 00".$value; 
        } 
        else if(strlen($value) == 3) 
        { 
         return $word[0]. " 0".$value; 
        } 
        else 
        { 
         //nothing 
        } 
       }, 
       $string 
      ); 
Смежные вопросы