PHP preg_match仅返回第一个匹配项

dur*_*svk 8 php regex

  1. 第一个问题是:

我正在使用http://www.phpliveregex.com/检查我的正则表达式是否正确,它找到了多个匹配的行.

我正在做这个正则表达式:

$lines = explode('\n', $text);
foreach($lines as $line) {
    $matches = [];
    preg_match("/[0-9]+[A-Z][a-z]+ [A-Z][a-z]+S[0-9]+\-[0-9]+T[0-9]+/uim", $line, $matches);

    print_r($matches);
}
Run Code Online (Sandbox Code Playgroud)

$text它看起来像这样:http://pastebin.com/9UQ5wNRu

问题是打印的匹配只有一个匹配:

Array
(
     [0] => 3Bajus StanislavS2415079249-2615T01
)
Run Code Online (Sandbox Code Playgroud)

为什么这样对我?有什么想法可以解决问题吗?

  1. 第二个问题

也许你已经注意到文本中没有斯洛伐克语的常规字母字符(来自pastebin).如何匹配这些字符并选择具有以下格式的用户:

{number}{first_name}{space}{last_name}{id_number}
Run Code Online (Sandbox Code Playgroud)

怎么做?

好的第一个问题是固定的.谢谢@ chris85.我应该preg_match_all在整篇文章中使用并做到这一点.现在我得到了一个名字中包含非斯洛伐克(英语)字母的所有学生.

chr*_*s85 8

preg_match是一场比赛.您需要preg_match_all用于全局搜索.

[A-Z]不包括该范围之外的字符.因为您正在使用i字符类实际的修饰符,[A-Za-z]它可能是您想要的,也可能不是.您可以使用\p{L}任何语言代替字符.

演示:https://regex101.com/r/L5g3C9/1

所以你的PHP代码就是:

preg_match_all("/^[0-9]+\p{L}+ \p{L}+S[0-9]+\-[0-9]+T[0-9]+$/uim", $text, $matches);
print_r($matches);
Run Code Online (Sandbox Code Playgroud)

  • 哇。我多么愚蠢。有同样的问题,不知道哪里出了问题。全局修饰符是不允许的,所以我认为它是默认的,盯着 preg_match 的手册页没有帮助我 - 也许我应该看看类似的功能.. ^^ (2认同)