Разделите строку на разные подстроки, но сохраните эти подстроки

Я пытаюсь разбить следующую строку:

Hello how are you<br>Foo bar hello 

В

 "Hello", " how", " are", " you", "<br>", " Foo", " bar", " Hello" 

Это возможно?

Related of "Разделите строку на разные подстроки, но сохраните эти подстроки"

Не делайте вещи сложнее, чем вам нужно. Используйте preg_split() с флагом PREG_SPLIT_DELIM_CAPTURE и PREG_SPLIT_DELIM_CAPTURE :

 $str = 'Hello how are you<br>Foo bar hello'; $array = preg_split( '/\s+|(<br>)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE); print_r( $array); 

Вывод:

 Array ( [0] => Hello [1] => how [2] => are [3] => you [4] => <br> [5] => Foo [6] => bar [7] => hello ) 

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

 $array = preg_split( '/(?:\s*(?=\s))|(<br>)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE); 

Итак, цель preg_split() – найти пятно в строке для разделения. Регулярное выражение, которое мы используем, состоит из двух частей: OR 'd вместе с | :

  1. (?:\s*(?=\s)) . Это начинается с не захватывающей группы (?:) , потому что, когда мы сопоставляем эту часть регулярного выражения, мы не хотим, чтобы она вернулась к нам. Внутри группы, не связанной с захватом, есть \s*(?=\s) , в котором говорится: «совпадение с нулевыми или более пробельными символами, но утверждайте, что следующий символ является символом пробела». Рассматривая нашу строку ввода, это имеет смысл:

     Hello how are you<br>Foo bar hello ^ ^ 

    Регулярное выражение начнется слева направо, найдите «Hello {space} как» и решите, как разбить строку. Он пытается сопоставить \s* с ограничением на то, что если он потребляет какое-либо пространство, осталось одно место. Таким образом, он разбивает строку на "Hello" . Когда это продолжается, у него есть «как вы
    Foo bar hello ". Он снова начинает матч, пытаясь совместить с того, где он остановился, и видит« как », и делает то же самое, что и выше. Он продолжается до тех пор, пока не осталось совпадений.

  2. Захват <br> с помощью (<br>) . Он фиксируется, потому что, когда мы сопоставляем это, мы хотим сохранить его в выходе, поэтому захват его вместе с PREG_SPLIT_DELIM_CAPTURE заставляет его возвращаться к нам, когда он сопоставляется (а не полностью потребляется).

Это приводит к :

 array(8) { [0]=> string(5) "Hello" [1]=> string(4) " how" [2]=> string(4) " are" [3]=> string(4) " you" [4]=> string(4) "<br>" [5]=> string(3) "Foo" [6]=> string(4) " bar" [7]=> string(6) " hello" } 

Не красиво, но достаточно просто:

 $data = 'Hello how are you<br>Foo bar hello'; $split = array(); foreach (explode('<br>', $data) as $line) { $split[] = array_merge($split, explode(' ', $line)); $split[] = '<br>'; } array_pop($split); print_r($split); 

Или версия 2:

 $data = 'Hello how are you<br>Foo bar hello'; $data = preg_replace('#\s|(<br>)#', '**$1**', $data); $split = array_filter(explode('**', $data)); print_r($split); 

Вот как я это сделаю:

  1. Взорвать строку с пробелом в качестве разделителя
  2. Цикл через части
  3. Используйте strpos и проверьте, содержит ли часть данный тег – в данном случае
  4. Если это произойдет, взорвите строку снова с тегом в качестве разделителя
  5. Вставьте все три элемента в массив результатов
  6. Если это не так, то вставьте его в массив результатов

Код:

 $str = 'Hello how are you<br>Foo bar hello'; $parts = explode(' ', $str); $result = array(); foreach ($parts as $part) { if(strpos($part, '<br>') !== FALSE) { $arr = explode('<br>', $part); $result = array_merge($result, $arr); $result[] = "<br>"; } else { $result[] = $part; } } print_r($result); 

Вывод:

 Array ( [0] => Hello [1] => how [2] => are [3] => you [4] => Foo [5] => <br> [6] => bar [7] => hello ) 

Демо!

Вот краткое решение. Замените на (пробел) пробел и разделите, используя пробел:

 <?php $newStr=str_replace("<br>"," <br> ","Hello how are you<br>Foo bar hello"); $str= explode(' ',$newStr); ?> 

Вывод print_r($str) :

 ( [0] => Hello [1] => how [2] => are [3] => you [4] => <br> [5] => Foo [6] => bar [7] => hello ) 

Заимствование шаблона preg_split из ответа @nickb :

 <?php $string = 'Hello how are you<br>Foo bar hello'; $array = preg_split('/\s/',$string); foreach($array as $key => $value) { $a = preg_split( '/\s+|(<br>)/', $value, -1, PREG_SPLIT_DELIM_CAPTURE); if(is_array($a)) { foreach($a as $key2 => $value2) { $result[] = $value2; } } } print_r($result); ?> 

Вывод:

 Array ( [0] => Hello [1] => how [2] => are [3] => you [4] => <br> [5] => Foo [6] => bar [7] => hello )