Возвращает вложенную строку, которая идет перед 10-значным контактным номером из строки

#php #string

#php #строка

Вопрос:

Привет, я не могу написать PHP-код, который возвращает все вложенные строки (которые идут непосредственно перед 10-значным числом).

Входная строка «8826835575 джагадиш jagadish82017@gmail.com варанаси 221311 да на да 1 на 9560153352 джаггу jagdish@vedittechnologies.com дели 123456 да na да 1 na 9555176779 jpkeshari jpjagadish@yahoo.com нойда 221311 да на да 1 на»

желаемый результат :

подстрока 1 = «8826835575 джагадиш jagadish82017@gmail.com варанаси 221311 да на да 1 на » подстрока 2 = «9560153352 джаггу jagdish@vedittechnologies.com дели 123456 да na да 1 na » подстрока 3 = «9555176779 jpkeshari jpjagadish@yahoo.com нойда 221311 да на да 1 на»

Пожалуйста, помогите мне…

Ответ №1:

preg_split() красиво, но загадочно. Вот альтернативное решение:

 <?php
$input = "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na";

// 1. Replaces all 10 digits preceded by an space by an carriage return.
$output = preg_replace('#s(d{10})#', "n$1", $input);

// 2. Stores the string by line by line in an array.
$output = explode("n", $output);

// array (
//   0 => '8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na',
//   1 => '9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na',
//   2 => '9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na',
// )
var_export($output);
  

Ответ №2:

Функция PHP preg_split с опцией PREG_SPLIT_DELIM_CAPTURE возвращает массив, чередующий 10-значное число, строку и т.д.

 $subject = '8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na';
$result = preg_split( '/(d{10})/', $subject ,'-1' , PREG_SPLIT_DELIM_CAPTURE);
array_shift($result);
for ( $ii = 0; $ii < count($result); $ii   ) {
  print $result[$ii] . $result[  $ii] . '<br>';
}
  

Первый элемент пуст, так shift что выключен, затем перебирайте пары печати массива. Их можно сохранить в другой массив или переменные вместо того, чтобы печатать здесь.

Выводит:

 8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 
9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 
9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na
  

Комментарии:

1. мне требуется вывод.. Вот так… array[0]=> 8826835575 джагадиш jagadish82017@gmail.com варанаси 221311 да на да 1 на [1] => 9560153352 джаггу jagdish@vedittechnologies.com дели 123456 да на да 1 на

2. спасибо …:) это код, который я искал

Ответ №3:

если вам нужен именно этот вывод, вы можете использовать что-то вроде этого:

 $input = "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na";

$splited = preg_split('~(d{10})~', $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);
$lines = array_map(function($item) use ($input) {
    return substr($input, $item[1] - 10, 10) . $item[0];
}, $splited);
var_dump($lines);
  

если вы хотите создать ассоциативный массив, который, вероятно, является лучшим результатом, это поможет:

 $input = "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na";

$splited = preg_split('~(d{10})~', $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$i = 0;
$lines = array_reduce($splited, function($carry, $item) use (amp;$i) {
      $i % 2 ? array_push($carry, $item) : $carry[array_pop($carry)] = $item;
    return $carry;
}, array());
var_dump($lines);
  

Ответ №4:

Я думаю, вы можете легко решить проблему, используя функцию PHP, разделенную регулярным выражением, предварительно разделенную шаблоном /[0-9]{10}/ :

Решение

 <?php

 $subject =  "8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na 9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na 9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na";

 $pattern = '/([0-9]{10})/';
 $val = preg_split ( $pattern , $subject, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

 for ($i=0; $i < count($val); $i =2){
    print($val[$i].$val[$i 1]);
 }

?>
  

Объяснение

Сначала вы разделяете монолитную строку с помощью preg_split , принимая в качестве разделителя любую комбинацию чисел из 10 цифр. Обратите внимание, что здесь мы используем опцию PREG_SPLIT_DELIM_CAPTURE with PREG_SPLIT_NO_EMPTY для записи также номера, как для вашего требования.

Тогда у вас есть массив, организованный следующим образом:

 [0] => first delimiter // your number
[1] => what follows
[2] => second delimiter // your second number
[3] => what follows
...
  

Вам просто нужно объединить результирующий массив так, как вы предпочитаете (я сделал с тупым циклом for, вы можете найти лучший PHP-nic способ сделать это). Результат будет следующим, как вы и хотели:

 8826835575 jagadish jagadish82017@gmail.com varanasi 221311 yes na yes 1 na
9560153352 jaggu jagdish@vedittechnologies.com delhi 123456 yes na yes 1 na
9555176779 jpkeshari jpjagadish@yahoo.com noida 221311 yes na yes 1 na
  

Комментарии:

1. Не могли бы вы, пожалуйста, объяснить это немного подробнее?

2. Да, я изменяю ответ с лучшим объяснением.

3. спасибо за ваш быстрый ответ… Но мне требуется 10-значный контактный номер в начале каждой вложенной строки …….. как 8826835575 джагадиш jagadish82017@gmail.com варанаси 221311 да на да 1 на

4. обновлено, чтобы вернуть ожидаемый результат и с описанием (не очень) загадочного preg_split, надеюсь, это поможет!