查找术语并捕获以下文本或空格后

时间:2017-06-10 05:37:48

标签: php regex whitespace

我有一些付款日志(txt),这些是文件中的一些模式:

模式1:

Nickname
                          -- blank space
Jon Doe

模式2:

Nickname:
Jon Doe

模式3:

Nickname: Jon Doe

我如何能够捕获所有文本,在这个例子中将是" Jon Doe",它始终位于术语(Nickname)之后的下一行并忽略空格?

更新 不是每个"昵称"有" :"之后的双点

类似于第一种模式

更新 Nickname可以以小写n开头。

3 个答案:

答案 0 :(得分:1)

这个正则表达式捕获名称,如果有一个:昵称后 我猜这是第一个例子的错误。

$re = '/[Nn]ickname:?\s+.*?(\w+\s\w+)/s';
$str = 'Nickname
               
Jon Doe
pattern 2:

 Nickname:
 Jon Doe
 pattern 3:

 Nickname: Jon Doe';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

在这里试试; https://regex101.com/r/fPLM70/3

编辑已添加:可选。 Edit2在昵称中添加了N / n

[Nn] is to make it accept both N and n.  
:? Means : can exsists or not.
\s+ means one or more spaces
.*? Because . can mean new line this means any new lines.
(\w+\s\w+) capture word space word

答案 1 :(得分:1)

preg_match_all()一起用于查找多次出现时,这将优于其他当前答案:

/[Nn]ickname:?\s+\K[A-Za-z ]+/

代码(Pattern Demo)(PHP Demo):

$in='Nickname

Jon Doe
pattern 2:

 Nickname:
 Jon Doe
 pattern 3:

 Nickname: Jon Doe';
var_export(preg_match_all('/[Nn]ickname:?\s+\K[A-Za-z ]+/',$in,$out)?$out[0]:[]);

\K标记完整匹配开始,因此不需要捕获组,这会将输出数组大小减少50%。

输出:

array (
  0 => 'Jon Doe',
  1 => 'Jon Doe',
  2 => 'Jon Doe',
)

答案 2 :(得分:0)

使用regex获取文字,然后trim删除空格

$fileContent = "Nickname:

Jon Doe";
preg_match('/Nickname:?\n(.*)/s', $fileContent, $match);
//$match[1] contains your line.

echo $match[1];