0

我正在开发一个 WordPress 插件,但在从正则表达式中获取正确信息时遇到了一个严重问题。

正则表达式的代码如下:

preg_match_all("|grass1(.*)grass2|i", $split[1], $out);

输出是一个空数组。

$split[1] 是电子邮件的正文(作为字符串)。

我正在寻找提取grass1 和grass2 之间的所有信息。因此,在电子邮件的正文中(作为字符串)存在“grass1 Something Something Grass2”,我需要Something Something 作为输出。这就是问题所在,而且很奇怪,因为如果字符串是主题、标题或整个电子邮件,它就可以正常工作。所以我对发生了什么感到困惑。任何有助于理解问题的帮助都会有所帮助。

电子邮件正文示例:

"_NextPart_000_0098_01CE2BC1.BFAF9200
 Content-Type: text/plain charset="us-ascii" Content-Transfer-Encoding: 7bit
 grass1 I'm testing the before or after function. If successful you should see all of           this message in a future email. grass2" 
4

1 回答 1

1

可能在grass1 和grass2 之间有一些换行符“\n”,所以“m”(多行搜索)修饰符可能很有用:

preg_match_all("|grass1(.*)grass2|im", $split[1], $out);

有关修饰符的引用,请参见 PHP 手册reference.pcre.pattern.modifiers.php

例如,“s”(“.”也匹配“\n”)可以作为替代:

preg_match_all("|grass1(.*)grass2|is", $split[1], $out);

ADD 明确一点:“m”和“s”相似但不相同:

  • "s" 让 "."(dot) 也匹配换行符,所以 ".*" 匹配多行文本
  • "m" 将模式应用于多行文本,因此 "a\nb" 匹配以a结尾并以b开头的行,换句话说,我可以使用 "\n" 作为搜索模式
于 2013-04-01T18:05:00.673 回答