我正在使用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
)
为什么对我这么做?什么可以解决问题的想法?
也许你已经注意到文本中没有斯洛伐克语的常规字母字符(来自pastebin)。如何匹配这些字符并选择具有以下格式的用户:
{number}{first_name}{space}{last_name}{id_number}
怎么做?
好的第一个问题是固定的。谢谢@ chris85。我应该使用preg_match_all
并在整个文本中执行此操作。现在我得到了一个名单中包含非斯洛伐克(英语)字母的所有学生的数组。
答案 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();