Php 从一个关键字到另一个关键字的preg匹配

Php 从一个关键字到另一个关键字的preg匹配,php,preg-match,Php,Preg Match,我用这个preg_匹配来记录单词phone后面的信息:它只记录那一行上的任何信息,我想一旦它到达下一行的返回框,它就会停止记录。这很有效 preg_match('/Telephone: (.*)/', $body, $Telephone); 现在我想用另一个关键字做一些类似的事情,但这可以跨越许多行,而不仅仅是一行,一旦信息结束,我需要下一行有另一个关键字,它总是相同的,它的地址 这里有一个例子 电话:090866544 地址:123 Hello Terrace 约翰斯顿 巴拉马古 西班牙 评

我用这个preg_匹配来记录单词phone后面的信息:它只记录那一行上的任何信息,我想一旦它到达下一行的返回框,它就会停止记录。这很有效

preg_match('/Telephone: (.*)/', $body, $Telephone);
现在我想用另一个关键字做一些类似的事情,但这可以跨越许多行,而不仅仅是一行,一旦信息结束,我需要下一行有另一个关键字,它总是相同的,它的地址

这里有一个例子

电话:090866544
地址:123 Hello Terrace
约翰斯顿
巴拉马古
西班牙

评论:

所以我希望它记录地址:和注释:之间的所有内容,并且在每个之后都有一个冒号

这是我徒劳的尝试,但我发现很难把握赛前,所以我可能做了一些愚蠢的错误

preg_match('/Address: (.*?)Comment:/', $body, $address);

可以使用允许点匹配换行符的s修改器,也可以使用这种图案:

$string =<<<LOD
Telephone: 090866544
Address: 123 Hello Terrace
Johnstown
Ballamagoo
Spain

Comment:
LOD;

$pattern = '~Address:\s*+\K(?>\S++|\s++(?!\bComment:))+~';
if (preg_match($pattern, $string, $match))
    $result = $match[0];

你试过m修饰符了吗?预匹配('/Address:(.*)注释:/m',$body,$Address);尝试过,也不起作用,在任何一种情况下,我都没有得到任何回报。您必须添加s修饰符。很抱歉,Casimir是正确的,您需要s修饰符不是mI dunno,现在有点困惑,但是“/Active Tables(.*)Comments/s”工作正常,并且它不包括文本中的活动表和注释,这正是我想要的,我以前肯定是打错了谢谢,我在这里举了一个例子,同样的事情也适用,但关键字不同,我想抓住活动表和注释之间的所有内容:但它似乎不匹配@user1547410:3原因:1)Rubular不是用于php,而是用于ruby,不支持
\K
2)在在线工具中测试模式时,不能使用分隔符
~
。3) 停止子字符串不是
注释:
,而是
注释
。。。。用作在线工具来测试你的php正则表达式。我无法让它继续工作,但这确实起作用-活动表(\w |\w)+注释:\s但它也包括结尾的注释文本,我希望它包括注释之前的所有内容:但不包括它,似乎不知道如何做,我可以去掉它或忽略它,但为了了解是否有人知道?“/Active Tables(.*)Comments/s”也可以使用工具进行测试,但不确定为什么最初在我的代码中不起作用,因为我尝试了它
Address:\s*+
\K                   # reset all that have been matched before
(?>                  # open an atomic group
   \S++              # all that isn't a white character (space, tab, newline)
  |                  # OR
   \s++(?!\bComment:) # white characters not followed by "Comment:"
)+                   # close the group and repeat one or more times