Я пытаюсь разбить следующую строку:
Hello how are you<br>Foo bar hello
В
"Hello", " how", " are", " you", "<br>", " Foo", " bar", " Hello"
Это возможно?
Не делайте вещи сложнее, чем вам нужно. Используйте 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 вместе с |
:
(?:\s*(?=\s))
. Это начинается с не захватывающей группы (?:)
, потому что, когда мы сопоставляем эту часть регулярного выражения, мы не хотим, чтобы она вернулась к нам. Внутри группы, не связанной с захватом, есть \s*(?=\s)
, в котором говорится: «совпадение с нулевыми или более пробельными символами, но утверждайте, что следующий символ является символом пробела». Рассматривая нашу строку ввода, это имеет смысл:
Hello how are you<br>Foo bar hello ^ ^
Регулярное выражение начнется слева направо, найдите «Hello {space} как» и решите, как разбить строку. Он пытается сопоставить \s*
с ограничением на то, что если он потребляет какое-либо пространство, осталось одно место. Таким образом, он разбивает строку на "Hello"
. Когда это продолжается, у него есть «как вы
Foo bar hello ". Он снова начинает матч, пытаясь совместить с того, где он остановился, и видит« как », и делает то же самое, что и выше. Он продолжается до тех пор, пока не осталось совпадений.
Захват <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);
Вот как я это сделаю:
strpos
и проверьте, содержит ли часть данный тег – в данном случае Код:
$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 )