preg_split без замены?

Пытаюсь разбить строку, но не хочу "удалять" то, что ищу...

Строка выглядит так:

МДВБ, 94010, (555) 555-5555, ХИИ, 94015, (555) 555-5555, ПУНИ, 94010, (555) 555-5555,

Я хочу разделить строку после номера телефона, но не хочу удалять номер...

Прямо сейчас у меня есть это:

preg_split("/\(?  (\d{3})?  \)?  (?(1)  [\-\s] ) \d{3}-\d{4}/x", $string)

Но это выводит:

Array
(
    [0] => MDVB, 94010, 
    [1] => KHII, 94015, 
    [2] => POONHY, 94010, 
)

Я думал, что нужно использовать preg_split... Есть ли что-то еще, что я должен использовать?


person Scooter5150    schedule 22.02.2012    source источник
comment
Глядя на вашу строку, вы, вероятно, могли бы использовать взорваться (',', $string);   -  person Shattuck    schedule 22.02.2012
comment
Нет, на самом деле это полная адресная строка, но поскольку данные содержат домашние адреса, номера социального страхования и т. д., я не хотел публиковать полную информацию, поэтому упростил данные... Строка больше похожа на имя, адрес ,город,штат,почтовый индекс,телефон,факс,ssn   -  person Scooter5150    schedule 22.02.2012


Ответы (4)


Вы должны использовать preg_match_all() для извлечения частей вашей строки.

<?php
$string = "MDVB, 94010, (555) 555-5555, KHII, 94015, (555) 555-5555, POONHY, 94010, (555) 555-5555,";

$res = preg_match_all("/([A-Z]+,\s+\d+,\s+\(\d{3}\) \d{3}-\d{4})/",$string,$matches);
print_r($matches);
?>

Выходы:

Array
(
    [0] => Array
        (
            [0] => MDVB, 94010, (555) 555-5555
            [1] => KHII, 94015, (555) 555-5555
            [2] => POONHY, 94010, (555) 555-5555
        )

    [1] => Array
        (
            [0] => MDVB, 94010, (555) 555-5555
            [1] => KHII, 94015, (555) 555-5555
            [2] => POONHY, 94010, (555) 555-5555
        )

)
person jasonlfunk    schedule 22.02.2012

Вы можете использовать параметр PREG_SPLIT_DELIM_CAPTURE, который также приведет к тому, что выражение в скобках в шаблоне разделителя будет захвачено и возвращено.

$parts = preg_split("/\(?  (\d{3})?  \)?  (?(1)  [\-\s] ) \d{3}-\d{4}/x",
                    $string,
                    null,
                    PREG_SPLIT_DELIM_CAPTURE);

Результирующий массив:

array(7) {
  [0]=>
  string(13) "MDVB, 94010, "
  [1]=>
  string(3) "555"
  [2]=>
  string(15) ", KHII, 94015, "
  [3]=>
  string(3) "555"
  [4]=>
  string(17) ", POONHY, 94010, "
  [5]=>
  string(3) "555"
  [6]=>
  string(1) ","
}

Я считаю, что это поведение, которое вы искали.

person drew010    schedule 22.02.2012
comment
Нет, я ищу [0] => MDVB, 94010, (555) 555-5555 [1] KHII, 94015, (555) 555-5555 [3] => POONHY, 94010, (555) 555-5555 - person Scooter5150; 22.02.2012
comment
В части скопированного мной регулярного выражения не было номера телефона в группе захвата ( ), поэтому он не перехватывается. Добавьте полный телефон к захвату, и он будет частью возвращаемого массива. - person drew010; 22.02.2012

$string = "MDVB, 94010, (555) 555-5555, KHII, 94015, (555) 555-5555, POONHY, 94010, (555) 555-5555,";
preg_match_all("/[A-Za-z]+, \d+, \(\d{3}\) \d{3}-\d{4}/", $string, $matches, PREG_SET_ORDER);

полученные результаты:

var_dump($matches);

array (
  0 => 
  array (
    0 => 'MDVB, 94010, (555) 555-5555',
  ),
  1 => 
  array (
    0 => 'KHII, 94015, (555) 555-5555',
  ),
  2 => 
  array (
    0 => 'POONHY, 94010, (555) 555-5555',
  ),
)
person Igor Parra    schedule 22.02.2012

Вам лучше использовать preg_match_all следующим образом:

preg_match_all("/(.*?(?:\(? (?:\d{3})? \)? [\-\s] )? \d{3}-\d{4})[^,]*(?:,|$)\s*/x",
               $string, $arr );
print_r($arr[1]);

ВЫВОД:

Array
(
    [0] => MDVB, 94010, (555) 555-5555
    [1] => KHII, 94015, (555) 555-5555
    [2] => POONHY, 94010, (555) 555-5555
)
person anubhava    schedule 22.02.2012