Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在全局正则表达式搜索中捕获下一次出现之前的所有内容_Php_Regex - Fatal编程技术网

Php 在全局正则表达式搜索中捕获下一次出现之前的所有内容

Php 在全局正则表达式搜索中捕获下一次出现之前的所有内容,php,regex,Php,Regex,比方说,这是我的字符串集: HOME this could have many lines HOME this one also HOME same 我怎样才能在下一次出现这样的“家”之前得到所有东西,包括新词:(为了简洁而缩短) 到目前为止,我尝试了:/HOME(.*)\n(.*)/gU,但我只得到了字符串的第一行: echo $matches[0]; // outputs 'this' echo $matches[1]

比方说,这是我的字符串集:

HOME
    this
    could
    have
    many
    lines
HOME
    this
    one
    also
HOME
    same
我怎样才能在下一次出现这样的“家”之前得到所有东西,包括新词:(为了简洁而缩短)

到目前为止,我尝试了:
/HOME(.*)\n(.*)/gU
,但我只得到了字符串的第一行:

echo $matches[0]; // outputs 'this'
echo $matches[1]; // outputs 'this'
echo $matches[2]; // outputs 'same'
// ... HOME(n)

注意:两个HOME之间的字符串可以有可变的行数,这让我头疼

您可以使用此正则表达式并抓取捕获的组#1:

正则表达式分解:

  • \b
    -断言单词边界
  • HOME
    -匹配文本
    HOME
  • \s+
    -1个或多个空格
  • (.*)
    -同时匹配0个或多个与换行符匹配的字符
  • (?=
    -开始前瞻以匹配
    • \sHOME\s
      -匹配文本
      主页
      ,四周为空白
    • |
      -或
    • \z
      -输入结束
  • -前瞻结束

使用
预分割
方法如下:

 preg_split('~^(?=HOME$)~m', $s, -1, PREG_SPLIT_NO_EMPTY)

详细信息

  • ^
    -匹配行首
  • (?=HOME$)
    -检查行是否等于
    HOME
因此,代码在与
HOME
相等的行的开头拆分


使用
PREG\u SPLIT\u NO\u EMPTY时,将从结果中忽略空匹配。如果我们添加另一个前瞻:
preg_split('~^(?!\A)(?=HOME$)~m',$s)

您可以使用函数代替regex

这是一种方法:

HOME\s+(.*)(?=HOME|$)
包括一些猜测(我想您不需要第一个换行;)

它捕获一行
HOME
之后的所有内容及其换行,直到下一个
HOME
文本结尾


.

这是问题的一部分:-为了更清晰地查看,我更喜欢MaxZoom的答案,否则我会选择或
HOME
上的
preg_split()
或类似的方法,如果需要正则表达式,但是
explode()
更好。
explode()有什么问题吗
solution?@revo由于一些情况,我仍然需要使用正则表达式,因此问题是:)正则表达式的崩溃确实帮助了我。:)请毫不犹豫地纠正我回答中的“少数漏洞”,我已经通过在开始时使用单词边界和在“前瞻”中使用
\s
HOME
之前使用
来解决这些漏洞,以确保我们匹配
HOME
,而不是
HOMELY
正是我要寻找的
/HOME\s+(*)(?=HOME |$)/gsU
简单而干净,它就像一个符咒^_^@法里兹鲁克曼:见vs。在这种情况下,惰性点匹配不是最有效的解决方案。在我根据自己的需要调整代码后,它被证明是最有效的代码。(y)
 preg_split('~^(?=HOME$)~m', $s, -1, PREG_SPLIT_NO_EMPTY)
$str = "HOME
    this
    could
    have
    many
    lines
HOME
    this
    one
    also
HOME
    same";

$parts = preg_split('/HOME/', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($parts);
HOME\s+(.*)(?=HOME|$)