[英]PHP - Improve Regex (space and non-capturing group)
我有这种字符串:
$string = "<strong>Blabla1</strong> Blaabla2<br /> Blaabla3 <strong>Blaabla4</strong> Blaabla5 Blaabla6<br /><br /> Blaabla7 <span style='color:#B22222;'>Blaabla8</span> Blaabla9";
我试图用preg_split
炸开其中有" "
或"<br />"
每个单词。
我的条件:
对于每个单词( Blablax
),我需要保留他的标签,例如<strong>
, <span>
, <em>
...,但是在<br />
或更多<br />
之后将其分割
我尝试了这一点,这要感谢stackoverflow上的另一篇文章:
preg_split('/<br(\s\/)?>\K|\s/',$string,null,PREG_SPLIT_NO_EMPTY);
输出:
array (size=12)
0 => string '<strong>Blabla1</strong>' (length=24)
1 => string 'Blaabla2<br />' (length=14)
2 => string 'Blaabla3' (length=8)
3 => string '<strong>Blaabla4</strong>' (length=25)
4 => string 'Blaabla5' (length=8)
5 => string 'Blaabla6<br />' (length=14)
6 => string '<br' (length=3)
7 => string '/>' (length=2)
8 => string 'Blaabla7' (length=8)
9 => string '<span' (length=5)
10 => string 'style='color:#B22222;'>Blaabla8</span>' (length=38)
11 => string 'Blaabla9' (length=8)
除 index 6
和index 7
(请参阅上面的OUTPUT)以及index 9
和index 10
之外 ,其他所有内容都起作用
我会期待的:
array (size=12)
0 => string '<strong>Blabla1</strong>' (length=24)
1 => string 'Blaabla2<br />' (length=14)
2 => string 'Blaabla3' (length=8)
3 => string '<strong>Blaabla4</strong>' (length=25)
4 => string 'Blaabla5' (length=8)
5 => string 'Blaabla6<br /><br />' (length=14)
6 => string 'Blaabla7' (length=8)
7 => string '<span style='color:#B22222;'>Blaabla8</span>' (length=45)
8 => string 'Blaabla9' (length=8)
参见index 5
和index 7
如果我只有一个<br />
我的正则表达式就可以工作,但是如果我有一个以上,则有一个错误...如果我有<span style...>
谢谢 !
$string = "<strong>Blabla1</strong> Blaabla2<br /> Blaabla3 <strong>Blaabla4</strong> Blaabla5 Blaabla6<br /><br /> Blaabla7 <span style='color:#B22222;'>Blaabla8</span> Blaabla9";
$matches = preg_split('/(<br.*?>|<span.*>)+\K|\s/sim', $string, null, PREG_SPLIT_NO_EMPTY );
var_dump($matches);
/*
array(9) {
[0]=>
string(24) "<strong>Blabla1</strong>"
[1]=>
string(14) "Blaabla2<br />"
[2]=>
string(8) "Blaabla3"
[3]=>
string(25) "<strong>Blaabla4</strong>"
[4]=>
string(8) "Blaabla5"
[5]=>
string(20) "Blaabla6<br /><br />"
[6]=>
string(8) "Blaabla7"
[7]=>
string(44) "<span style='color:#B22222;'>Blaabla8</span>"
[8]=>
string(8) "Blaabla9"
}
*/
查看索引5和索引7的预期数组,您可能需要此正则表达式:
preg_split('~(?:</?[a-zA-Z0-9][^>]*+>|\S)++\K|\s~',$string,null,PREG_SPLIT_NO_EMPTY);
输出:
array(9) {
[0]=>
string(24) "<strong>Blabla1</strong>"
[1]=>
string(14) "Blaabla2<br />"
[2]=>
string(8) "Blaabla3"
[3]=>
string(25) "<strong>Blaabla4</strong>"
[4]=>
string(8) "Blaabla5"
[5]=>
string(20) "Blaabla6<br /><br />"
[6]=>
string(8) "Blaabla7"
[7]=>
string(44) "<span style='color:#B22222;'>Blaabla8</span>"
[8]=>
string(8) "Blaabla9"
}
正则表达式会尝试匹配完整标签,如果无法使用完整标签,它将使用一个非空格字符,然后冲洗并重复。 这将防止标签被拆分,从而为索引5和7提供预期的输出。
不过,我不建议您使用正则表达式进行此操作。 编写正则表达式时,我没有查阅HTML规范,因此正则表达式非常脆弱,有可能在输入时中断。 您可能想学习如何使用此问题中列出的库之一正确解析HTML: 如何在PHP中解析和处理HTML / XML?
这是正则表达式
((?:<br\s*\/?>)+)|(?<!<br)\s+(?!\/?>)
将其与$1\\n
作为替换字符串的preg_replace
使用,然后可以按换行分隔以获取数组(删除空数组)。
参见演示 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.