#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, надеюсь, это поможет!