PHP preg_match仅返回第一个匹配项

时间:2016-12-20 17:29:07

标签: php regex

  1. 第一个问题是:
  2. 我正在使用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);
    }
    
    $text上的

    ,如下所示:http://pastebin.com/9UQ5wNRu

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

    Array
    (
         [0] => 3Bajus StanislavS2415079249-2615T01
    )
    

    为什么对我这么做?什么可以解决问题的想法?

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

      {number}{first_name}{space}{last_name}{id_number}
      

      怎么做?

      好的第一个问题是固定的。谢谢@ chris85。我应该使用preg_match_all并在整个文本中执行此操作。现在我得到了一个名单中包含非斯洛伐克(英语)字母的所有学生的数组。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您还可以使用T-Regx库:

pattern("^[0-9]+\p{L}+ \p{L}+S[0-9]+\-[0-9]+T[0-9]+$", 'uim')->match($text)->all();