1

我正在尝试拆分以下字符串:

Hello how are you<br>Foo bar hello

进入

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

这可能吗?

4

5 回答 5

3

不要让事情变得比你必须做的更难。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 和|:

  1. (?:\s*(?=\s)). 这从一个非捕获组开始(?:),因为当我们匹配这部分正则表达式时,我们不希望它返回给我们。在非捕获组内, is\s*(?=\s)表示“匹配零个或多个空白字符,但断言下一个字符是空白字符”。查看我们的输入字符串,这是有道理的:

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

    正则表达式将从左到右开始,找到“Hello{space}how”,并决定如何拆分字符串。它试图匹配\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" 
}
于 2013-09-19T00:05:12.050 回答
1

不漂亮,但足够简单:

$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);
于 2013-09-18T23:54:56.157 回答
0

从@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
)
于 2013-09-19T00:12:32.560 回答
0

这是一个简短的解决方案。替换<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
)
于 2013-09-19T00:06:51.760 回答
0

这就是我的做法:

  1. 用空格作为分隔符分解字符串
  2. 循环遍历各个部分
  3. 使用strpos并检查部件是否包含给定的标签——<br>在这种情况下
  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
)

演示!

于 2013-09-18T23:56:43.953 回答