php - space 和制表符之间的单词(或:按字母顺序排序出勤报告)

php - word between space and tab (or: sort attendance report alphabetically)

我正在尝试提取出勤报告的姓氏,以便按姓氏的字母顺序对其进行排序。 出勤报告(应该是 .cvs)如下所示:

Artur Testme    Left    27.1.2021, 10:34:15

(已为 post 提取制表符,因此此处:

Artur Testme [Tab] Left [Tab] 27.1.2021, 10:34:15)

我通过 fgetcsv 打开它并在 space 和一个选项卡之间找到单词:

if (($handle = fopen($_FILES["file"]["test.cvs"], "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {   
        preg_match('/(\s)(.*)(\t)/', $data[0], $matches);
        echo $matches[0]."<br>"; 
    }
    fclose($handle);
} 
?>

输出如下所示: 测试我离开

我不明白为什么我也拿第二个字。 我的理解是,就是应该在space和tab之间取词。 我希望有人可以帮助我。

顺便说一句:如果你能找到一种很好且快速的方法来按字母顺序对所有数据进行排序,并在出勤报告中剔除双打。这将对我有很大帮助并节省我很多 google 时间. :)

谢谢! 亲切的问候丹尼尔

关于正则表达式问题,.* 匹配整行(也包括空格和制表符),然后回溯以匹配最后一个制表符。这就是为什么第二组也包含第二个词。

使用\s 也匹配换行符或制表符。您可以使用 \h 来匹配水平空白字符,但使用否定字符 class [^\H\t]

的制表符除外

您可以使用\w+匹配1个或多个单词字符,或使用\S+匹配1个或多个非空白字符。

$pattern = '/[^\H\t](\w+)\t/';
$s = 'Artur Testme  Left    27.1.2021, 10:34:15';

if (preg_match($pattern, $s, $matches)) {
    var_dump($matches[1]);
}

输出

string(6) "Testme"