如何捕获字符串的一部分包括分隔符?

时间:2017-06-06 14:57:13

标签: php regex string

有一个如此形成的字符串:

#foo1 foo2# foo3 foo4 #foo5# ##foo6# #foo7## #foo8 foo9#

预期应该是如此形成的数组:

array (
  [0] => #foo1 foo2#
  [1] => foo3
  [2] => foo4
  [3] => #foo5#
  [4] => ##foo6# #foo7##
  [5] => #foo8 foo9#
);

或者更简单地分割空间,但是在分隔符内捕获所有内容,包括它......在数组中。

注意: 字符串可以重复播放。

1 个答案:

答案 0 :(得分:4)

您可以使用此替换正则表达式preg_match_all

/(#+).*?\1|\S+/

RegEx Demo

RegEx分手:

  • (#+) - 在捕获的组#1中匹配1个或多个#
  • .*? - 匹配0个或更多任何字符(非贪婪)
  • \1 - 对已捕获的组#1进行反向引用,以确保我们在RHS上具有相同的#
  • | - 或
  • \S+ - 一个或多个非空白字符

<强>代码:

$str = '#foo1 foo2# foo3 foo4 #foo5# ##foo6# #foo7## #foo8 foo9#';

preg_match_all('/(#+).*?\1|\S+/', $str, $matches);

print_r($matches[0]);

<强>输出:

Array
(
    [0] => #foo1 foo2#
    [1] => foo3
    [2] => foo4
    [3] => #foo5#
    [4] => ##foo6# #foo7##
    [5] => #foo8 foo9#
)