可以说,这是我的字符串集:

HOME
    this
    could
    have
    many
    lines
HOME
    this
    one
    also
HOME
    same


在下一次出现“ HOME”之前,我如何获得包括换行符在内的所有信息,如下所示:(为简洁起见,已缩短)

echo $matches[0]; // first home outputs 'this\n could\n have\n many\n lines\n'
echo $matches[1]; // second home outputs 'this\n one\n also\n'
echo $matches[2]; // third home outputs 'same\n'
// ... HOME(n)


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

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


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

最佳答案

通过以下方式使用preg_split

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


请参见PHP demo

细节:


^-匹配行首
(?=HOME$)-正向超前检查行是否等于HOME


因此,代码在等于HOME的行的开头拆分。

使用PREG_SPLIT_NO_EMPTY时,结果中将省略空匹配项。如果我们添加另一个前瞻:preg_split('~^(?!\A)(?=HOME$)~m', $s),可以避免这种情况。

关于php - 在全局RegEx搜索中捕获下一次出现之前的所有内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43618845/

10-16 19:04