Windows的preg_match()失败

时间:2018-11-15 15:54:55

标签: php regex

我需要检查字符串是否包含表,如下所示:

+--------+------+-------+
| <info>number</info> | <info>char</info> | <info>word</info>  |
+--------+------+-------+
| 1      | a    | alfa  |
| 2      | b    | beta  |
| 3      | c    | gamma |
+--------+------+-------+

我不知道列数,也不知道行数,但这是表的结构。

此正则表达式适用于Unix,但不适用于Windows

[\+\-]+[\r\n](\|(\s+<info>[^<]+<\/info>\s+\|)+)[\r\n](\+|\-)+[\r\n]((\|(\s+[^\|]+\s+\|)+[\r\n])+)(\+|\-)+

这是一个测试:
https://regex101.com/r/TSxSd7/1

这是代码的一部分:

    $regexRowDivider = '[\+\-]+';
    $regexHeader = '(\|(\s+<info>[^<]+<\/info>\s+\|)+)';
    $regexRow = '\|(\s+[^\|]+\s+\|)+';
    $regexRows = '((' . $regexRow . '[\r\n])+)';
    $regexTable = $regexRowDivider . '[\r\n]' . $regexHeader . '[\r\n]' . $regexRowDivider . '[\r\n]' . $regexRows . $regexRowDivider;

    preg_match('/' . $regexTable . '/', $output, $matches);

经过数小时的测试,我无法弄清楚问题出在哪里。你有什么主意吗? preg_last_error()返回0(无错误)

1 个答案:

答案 0 :(得分:0)

这可能是因为您仅接受\r\n中的一个,而Windows使用了两者(\r\n)。您可以使用\R来匹配这两个换行符(以及更多)。

我消除了一些复杂性,因此它不会在每个单元格中强制使用空格:

[+-]+\R+\|(\s*<info>[^<]+<\/info>\s*\|)+\R+[+-]+\R+\|([^|]+\|)+\R+[+-]+

\---/   \------------------------------/   \---/   \----------/   \---/
Line             Column Headers            Line      Contents     Line

Try it online