繁体   English   中英

PHP-改进正则表达式(空格和非捕获组)

[英]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 6index 7 (请参阅上面的OUTPUT)以及index 9index 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 5index 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);

ideone上的演示

输出:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM