0

我使用这个 preg_match 在单词 Telephone: 之后记录信息:它只记录该 1 行上的任何信息,我认为一旦它到达下一行的回车,它就会停止记录。这很好用。

preg_match('/Telephone: (.*)/', $body, $Telephone);

现在我想用另一个关键字做类似的事情,但这可以跨越多行而不仅仅是一行,一旦信息结束,我需要下一行有另一个始终相同的关键字,它的地址。

这是一个例子。

电话:090866544
地址:123 Hello Terrace
Johnstown
Ballamagoo
Spain

评论:

所以我希望它记录地址:和评论之间的所有内容:并且每个之后总是有一个冒号。

这是我徒劳的尝试,但我发现很难掌握 preg_match 所以我可能做错了什么愚蠢的错误

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

1 回答 1

0

您可以使用允许点匹配换行符的 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];

说明:

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
于 2013-06-28T19:06:07.440 回答