#php #regex #preg-split
#php #регулярное выражение #preg-split
Вопрос:
Я хочу разделить строку только на пробелы, перед которыми нет определенного разделителя (: в моем случае). Например.:
$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: биты перед двоеточиями известны и остаются неизменными, возможно, их включение каким-то образом облегчает задачу (не разделять символы пробела в строках, которые должны оставаться вместе)?
Комментарии:
1. Я виноват в неправильной формулировке вопроса, хотя ваше решение отлично работает, если других пробелов нет, некоторые из моих строк, которые должны оставаться вместе, содержат дополнительные пробелы, поэтому такие вещи, как «что бы это ни было», должны оставаться одной строкой.
Ответ №1:
Вы можете использовать предварительный просмотр в своем разделенном регулярном выражении:
/h (?=[A-Z][a-z]*: )/
Демонстрация регулярных выражений
Регулярное h (?=[A-Z][a-z]*: )
выражение соответствует 1 пробелам, за которым следует слово, начинающееся с прописной буквы, двоеточия и пробела.
Комментарии:
1.
whatever this is
должно оставаться как одна строка,2. Спасибо! можно ли изменить это так, чтобы оно учитывало некоторые биты перед двоеточием, являющиеся строкой из двух цифр в верхнем регистре? такие вещи, как «AT», «AB», не разделяются должным образом: «Действие: этот пример BB: запрос Bla bla: 555». в противном случае потрясающий ответ, спасибо!
3. @peterxz: Попробуйте:
/h (?=[A-Z] [a-z]*: )/
Ответ №2:
вы можете это сделать
$string = "Time: 10:40 Request: page.php Action: whatever this is Refer: Facebook";
$split = preg_split('/h (?=[A-Z][a-z]*:)/', $string);
dd($split);
Ответ №3:
Другим вариантом может быть сопоставление с тем, что находится перед двоеточием, а затем сопоставление со следующей частью, которая начинается с пробела, символов без пробелов и двоеточия:
S :h .*?(?=h S :)Kh
S :
Сопоставьте 1 раз символ без пробеловh
Сопоставьте 1 раз с горизонтальным символом пробела.*?
Сопоставьте любой символ, кроме символа новой строки, не жадный(?=h S :)
Позитивный взгляд, утверждайте, что справа находится 1 горизонтальные символы с пробелами, 1 символы без пробелов и двоеточиеKh
Забудьте, что было сопоставлено с использованиемK
, и сопоставьте 1 горизонтальные символы пробела