PHP preg_match_all没有返回所需的输出

时间:2016-08-14 07:05:57

标签: php string preg-match-all

我正在使用preg_match_all来搜索字符串中的指定关键字,如果找到它,我会在该关键字之前和之后选择几个字。我在preg_match_all下面使用

preg_match_all('~\b(?:[^ ]+ ){0,'.$prev.'}'.trim($keyword).'(?: [^ ]+){0,'.$next.'}\b~i',$text,$output);

这里$ keyword是一个关键字,$ prev和$ next是表示需要选择多少单词的数字,$ text是主字符串,$ output是结果数组。所以如果我的字符串在

之下
PROFIT & LOSS NOFORMING P 152 22. ADDITIONAL INFORMATION: A) AUDITORS REMUNERATION (EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees (including limited review) 3.45 2.42

这里的关键字是“审核费用”,我得到了所需的输出,就像这样

EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees (including limited review) 3.45 2.42

但是在下面的字符串中,如果我的关键字和下一个单词之间没有空格,则只返回该字符串之前的几个单词,而不是该关键字之后的下一个单词。

PROFIT & LOSS NOFORMING P 152 22. ADDITIONAL INFORMATION: A) AUDITORS REMUNERATION (EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees(including limited review) 3.45 2.42

它只返回

EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees

请在这里指导我,如果我的关键字及其下一个单词之间没有空格,如何获取下一个单词。

1 个答案:

答案 0 :(得分:1)

如果您只担心关键字后面的字词,则需要确保匹配应该是可选的空格字符(或非字字符)(零或更多):

'~\b(?:\S+\s+){0,10}Audit Fees(?:\s*\S+){0,5}\b~'

请参阅this regex demo

在关键字optional(\s*匹配零个或多个空格)之后,这将允许非空白块之间的空格。

模式详情

  • \b - 领先的字边界
  • (?:\S+\s+){0,10} - 零到十个1 +非空白符号后跟1 +空格
  • Audit Fees - 文字关键字
  • (?:\s*\S+){0,5} - 零到五个0+空白符号后跟1 +非空白符号
  • \b - 尾随字边界

PHP demo

$prev = 10;
$keyword = "Audit Fee";
$next = 5;
$text= "PROFIT & LOSS NOFORMING P 152 22. ADDITIONAL INFORMATION: A) AUDITORS REMUNERATION (EXCLUDING SERVICE TAX) (` in crores) ParticularsCurrent yearPrevious year As audit fees(including limited review) 3.45 2.42";
$re = '~\b(?:\S+\s+){0,'.$prev.'}'.trim($keyword).'(?:\s*\S+){0,'.$next.'}\b~i';
preg_match_all($re,$text,$output);
print_r($output);