Как я могу разбить строку по пробелам, которые не имеют прецедента для определенного символа? - PullRequest
1 голос
/ 18 апреля 2019

Я хочу разбить строку только на пробелы, которые не имеют определенного разделителя (: в моем случае) перед ним. E.g.:

$string = "Time: 10:40 Request: page.php Action: whatever this is Refer: Facebook";

Тогда из чего-то вроде этого я хочу получить массив такой, что:

$array = ["Time: 10:40", "Request: page.php", "Action: whatever this is", "Refer: Facebook"];

До сих пор я пробовал следующее:

$split = preg_split('/(:){0}\s/', $visit);

Но это все еще разделяется при каждом появлении белого пространства.

Редактировать: Я думаю, что задал неправильный вопрос, однако "что бы это ни было" должно оставаться в одной строке

Редактировать 2: Биты перед двоеточиями известны и остаются прежними, может быть, включение их каким-то образом облегчает задачу (не разбивая пробельные символы на строки, которые должны оставаться вместе)?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2019

Вы можете использовать lookahead в своем регулярном выражении:

/\h+(?=[A-Z][a-z]*: )/

RegEx Demo

Regex \h+(?=[A-Z][a-z]*: ) соответствует 1+ пробелам, за которыми следует слово, начинающееся с заглавной буквы, двоеточия и пробела.

1 голос
/ 18 апреля 2019

вы можете сделать это

$string = "Time: 10:40 Request: page.php Action: whatever this is Refer: Facebook";

$split = preg_split('/\h+(?=[A-Z][a-z]*:)/', $string);

dd($split);
0 голосов
/ 18 апреля 2019

Другой вариант может состоять в том, чтобы соответствовать тому, что находится перед двоеточием, а затем совпадать со следующей частью, которая начинается с пробела, непробельных символов и двоеточия:

\S+:\h+.*?(?=\h+\S+:)\K\h+
  • \S+: Матч 1+ умножение на символы без пробелов
  • \h+ Совпадение 1+ умножение на символы пробелов по горизонтали
  • .*? Совпадение с любым символом, кроме новой строки без жадности
  • (?=\h+\S+:) Положительныйпосмотрите вперед, подтвердите, что справа 1+ горизонтальных пробельных символов, 1+ непробельных символов и двоеточие
  • \K\h+ Забудьте, что было найдено с помощью \K и сопоставьте 1+ горизонтальных пробельных символов

Regex demo | php demo

...