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

#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 горизонтальные символы пробела

Демонстрация регулярных выражений | демонстрация php