我正在尝试拆分以下字符串:
Hello how are you<br>Foo bar hello
进入
"Hello", " how", " are", " you", "<br>", " Foo", " bar", " Hello"
这可能吗?
不要让事情变得比你必须做的更难。preg_split()
与标志一起使用PREG_SPLIT_DELIM_CAPTURE
,并捕获<br>
:
$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))
. 这从一个非捕获组开始(?:)
,因为当我们匹配这部分正则表达式时,我们不希望它返回给我们。在非捕获组内, is\s*(?=\s)
表示“匹配零个或多个空白字符,但断言下一个字符是空白字符”。查看我们的输入字符串,这是有道理的:
Hello how are you<br>Foo bar hello
^ ^
正则表达式将从左到右开始,找到“Hello{space}how”,并决定如何拆分字符串。它试图匹配\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);
从@nickb的答案中借用preg_split
模式:
<?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
)
这是一个简短的解决方案。替换<br>
为 (space <br>
space) 并使用空格分割:
<?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
)
这就是我的做法:
strpos
并检查部件是否包含给定的标签——<br>
在这种情况下代码:
$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
)