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
-1个或多个空格\s+
-同时匹配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|$)