Preg_split уникальная строка - PullRequest
1 голос
/ 04 мая 2020

Итак, у меня происходит нечто сложное, и я не могу понять, как правильно разделить мою строку.

Вот var_dump($line):

Er.php:155:string 'TEST     Test    Test2  Director of Testing  +31-20-406-0000 +31-20-406-0001     testing@gmail.com    0000-10-27  2001-08-01  TestLocation    Amsterdam   AMSTERDAM   Amsterdam   100         Reputation Management       EMPL    EMEA        FHAMS   TEST3                2016-10-05 13:07:00 2019-03-26 10:01:00' (length=338)

Итак, в течение последних 2 часов я пытался разделить эти разделы и не могу заставить его работать:

$arr = preg_split("/[\s\n]/", $line); - я пробовал все, но строка использование вкладок, но некоторые зависят от 2+ пробелов, в то время как некоторые не должны разбиваться.

Я пытался разделить их, используя один пробел, но это не работает с 2016-10-05 13:07:00, Director of Testing и Reputation Management являются одним пробелом и должны оставаться вместе.

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

Array:
[1] => TEST
[2] => Test
[3] => Test2
[4] => Director of Testing
[5] => +31-20-406-0000
[6] => +31-20-406-0001
[7] => testing@gmail.com
[8] => 0000-10-27
[9] => 2001-08-01

enter image description here

1 Ответ

2 голосов
/ 04 мая 2020

Сначала вы должны найти строку с датой. Регулярное выражение даты не на 100% (например, 2020-13-49 25:61:61 будет найдено), но есть другие потоки, если вы ищете это (проверка диапазона номеров длинна в регулярном выражении). Вам также следует искать номера телефонов, которые начинаются с + и содержат целые и дефисы после. Если встречается какой-либо из этих случаев, мы фиксируем это значение. Кроме того, если встречаются два последовательных пробела (\s) или табуляция (\t), они должны быть разлиты на это.

$test = 'SIMONSH     Test   Test2  Director of GCL Operations  +31-20-406-0000 +31-20-406-0001     Test.me@group.com    0000-10-27  2001-08-01  ZH    Amsterdam   AMSTERDAM   Amsterdam   100         Reputation Management       EMPL    EMEA        FHAMS   MORTELLM                2016-10-05 13:07:00 2019-03-26 10:01:00';
$arr = preg_split('/(\d{4}-\d{2}-\d{2}\h+\d{2}:\d{2}:\d{2}|\+[\d-]+)\h*|(?:\s{2,}|\t)/', $test, -1,  PREG_SPLIT_NO_EMPTY| PREG_SPLIT_DELIM_CAPTURE);
print_r($arr);

Примерно проверка даты: \d{4}-\d{2}-\d{2}\h+\d{2}:\d{2}:\d{2}
Проверка номера телефона: \+[\d-]+
\h* после этих двух строк, потому что мы не заботимся о том, чтобы завершать пробелы в них.

Два последовательных пробела или табуляция: (?:\s{2,}|\t)
?: () делает невозможным захват, в противном случае вы получите пробел, который также вызвал разрыв в результате.

...