php - 正则表达式 - 空间和非捕获组

时间:2015-04-15 17:08:42

标签: php regex

我有这种字符串:

Blabla1 Blaabla2<br />  Blaabla3 Blaabla4

我试图在" ""<br />"preg_split之间爆炸每个单词。

我的观点:

Blabla1
Blabla2 <br />
Blaabla3
Blaabla4

我尝试使用此正则表达式(?:(<br\s))|\s,但未设法排除"/>"

http://regexr.com/3aqs0

谢谢!

2 个答案:

答案 0 :(得分:3)

你可以这样做的一种方式:

$str = 'Blabla1 Blaabla2<br />  Blaabla3 Blaabla4';
$results = preg_split('~(?:<br[^>]*>\s*\K|\s+)~', $str);
print_r($results);

<强>输出

Array
(
    [0] => Blabla1
    [1] => Blaabla2<br />  
    [2] => Blaabla3
    [3] => Blaabla4
)

答案 1 :(得分:1)

如果没有更多HTML,可以使用RegEx。 Otherwise there are many better ways

使用<br(\s\/)?>\K|\s

$matches = preg_split('/<br(\s\/)?>\K|\s/',$string);

这也适用于<br>(也是正确的HTML)

考虑标志PREG_SPLIT_NO_EMPTY,因为使用示例字符串将会有空元素:

preg_split('/<br(\s\/)?>\K|\s/',$string,null,PREG_SPLIT_NO_EMPTY);

更新:要保留<br />,您需要使用\K重置匹配项。在the language reference中有一个很好的例子:

  从PHP 5.2.4起,

\ K可用于重置匹配开始。例如,   模式foo \ Kbar匹配&#34; foobar&#34;,但报告它已匹配   &#34; BAR&#34 ;.使用\ K不会干扰捕获的设置   子。例如,当模式(foo)\ Kbar匹配&#34; foobar&#34;时,   第一个子字符串仍然设置为&#34; foo&#34;。