我有一些付款日志(txt)
,这些是文件中的一些模式:
模式1:
Nickname
-- blank space
Jon Doe
模式2:
Nickname:
Jon Doe
模式3:
Nickname: Jon Doe
我如何能够捕获所有文本,在这个例子中将是" Jon Doe",它始终位于术语(Nickname)
之后的下一行并忽略空格?
更新 不是每个"昵称"有" :"之后的双点
类似于第一种模式
更新
Nickname
可以以小写n
开头。
答案 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];