如何 preg_split 所有字符,但不拆分 <b> 和 <br>

How to preg_split all character, but don't split <b> and <br>

这里有很多关于 [preg_split] 的问题,但是 none 与我的问题有关。我正在使用以下代码将字符串拆分为 PHP 中的字符,如下所示:

$str = "My <b>table</b> in brown <br> Help";
$char = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($char);

输出为:

Array
(
    [0] => M
    [1] => y
    [2] =>  
    [3] => <
    [4] => b
    [5] => >
    [6] => t
    [7] => a
    [8] => b
    [9] => l
    [10] => e
    [11] => <
    [12] => /
    [13] => b
    [14] => >
    [15] =>  
    [16] => i
    [17] => n
    [18] =>  
    [19] => b
    [20] => r
    [21] => o
    [22] => w
    [23] => n
    [24] =>  
    [25] => <
    [26] => b
    [27] => r
    [28] => >
    [29] => ...
)

但我期望如下:

Array
(
    [0] => M
    [1] => y
    [2] =>  
    [3] => <b>
    [6] => t
    [7] => a
    [8] => b
    [9] => l
    [10] => e
    [11] => </b>
    [15] =>  
    [16] => i
    [17] => n
    [18] =>  
    [19] => b
    [20] => r
    [21] => o
    [22] => w
    [23] => n
    [24] =>  
    [25] => <br>
    [29] => ...
)

字符如:<b>,</b>,<br>,<i>,</i> 等不应拆分。

谢谢。

您可以通过拆分 <> 中的单个字符或一系列字符来实现此目的,使用 PREG_SPLIT_DELIM_CAPTURE 选项捕获每个值:

$str = "My <b>table</b> in brown <br> Help";
$char = preg_split('#(</?[a-z]+>|[a-z ])#ui', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($char);

输出:

Array (
  [0] => M
  [1] => y
  [2] =>
  [3] => <b>
  [4] => t
  [5] => a
  [6] => b
  [7] => l
  [8] => e
  [9] => </b>
  [10] =>
  [11] => i
  [12] => n
  [13] => 
  [14] => b
  [15] => r
  [16] => o
  [17] => w
  [18] => n
  [19] =>
  [20] => <br>
  [21] =>
  [22] => H
  [23] => e
  [24] => l
  [25] => p 
)

Demo on 3v4l.org