2014-12-17 3 views
0

Конечная цель: изменение кусков чисел в базе данных, таких как 0000000 и 22222, и 333333333333 на разную длину. Например, номера телефонов, которые могут содержать префиксы, такие как коды стран (например, +00 (000) 000-0000 или шаблон 2, 3, 3, 4), поэтому возможность изменения длины в зависимости от другой формат телефонного номера был бы приятным.Как разбить строку на куски нефиксированных длин с помощью php?

Я люблю идею использования взрываются или chunk_split для простоты, как я буду обрабатывать большой объем данных, и я не хочу, чтобы осушить сервер слишком много:

$string = "1111111111";  
$new_nums = chunk_split($string, 3, " "); 
echo $new_nums; 

^Единственная проблема вот что я могу использовать только одну цифру для длины.

Каков наилучший способ? Должен ли я создать функцию?

+1

короткого ответ: регулярные выражения –

+0

Вы можете проверить пример того, как использовать регулярные выражения для разбора/форматирования номера телефона в этом SOF вопросе HTTP : //stackoverflow.com/questions/4708248/formatting-phone-numbers-in-php – nunofmendes

+0

Regex творит чудеса. Большое спасибо, @Dagon !! :) – natfoxxe

ответ

0

Хотя вы упоминаете номер телефона в вашем примере это звучит, как вы хотите что-то, что может сделать больше, а также допускается указывать несколько и переменной длины кусок. Один из способов сделать это - создать функцию, которая берет ваши данные, символ разделителя/разделителя и ряд значений куска.

Вы можете использовать func_num_args() и func_get_args(), чтобы выяснить длину ваших кусков.

Вот пример такой функции:

<?php 

function chunkData($data, $separator) 
{ 
    $rebuilt = ""; 
    $num = func_num_args(); 
    $args = func_get_args(); 
    if($num > 2) 
    { 
     for($i = 2; $i < $num; $i++) 
     { 
      if(strlen($data) > 0) 
      { 
       $string = substr($data, 0, $args[$i]); 
       $segment = strpos($data, $string); 
       if($segment !== false) 
       {     
        $rebuilt .= $string . $separator; 
        $data = substr_replace($data, "", 0, $args[$i]); 
       } 
      } 
     } 
    } 
    $rebuilt .= $data; 
    $rebuilt = rtrim($rebuilt, $separator); 
    return $rebuilt; 
} 

//Usage examples: 

printf("Phone number: %s \n", chunkData("2835552093", "-", 3, 3, 4)); 
printf("Groups of three letters: %s \n", chunkData("ABCDEFGHI", " ", 3, 3, 3)); 
printf("King Roland's passcode: %s \n", chunkData("12345", ",", 1, 1, 1, 1, 1)); 
printf("Append leftovers: %s \n", chunkData("BlahBlahBlahJustPlainBlah", " ", 4, 4, 4)); 
printf("Doesn't do much: %s \n", chunkData("huh?", "-")); 

?> 

//Output: 

Phone number: 283-555-2093 
Groups of three letters: ABC DEF GHI 
King Roland's passcode: 1,2,3,4,5 
Append leftovers: Blah Blah Blah JustPlainBlah 
Doesn't do much: huh? 
+0

Вау, это невероятно полезно. chunk_data, как вы его использовали, определенно дал мне то, что я хочу. Я высоко ценю количество динамических параметров, которые вы мне дали, и все они работают очень хорошо, не перегружая сервер. Спасибо! :) – natfoxxe

+0

Не проблема, рад, что это помогло! Я сохранил регулярное выражение для него. – Crackertastic

1

С регулярным выражением?

$regex = "/(\\d{2})(\\d{3})(\\d{3})(\\d{4})/"; 
$number = "111111111111"; 
$replacement = "+$1 ($2) $3-$4"; 

$result = preg_replace($regex, $replacement, $number); 

https://regex101.com/r/gS1uC1/1

+0

А, да, регулярное выражение. Отличный друг. Я определенно буду использовать это. Большое спасибо! :) – natfoxxe

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