我需要检查字符串是否包含表,如下所示:
+--------+------+-------+
| <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
(无错误)
答案 0 :(得分:0)
这可能是因为您仅接受\r
或\n
中的一个,而Windows使用了两者(\r\n
)。您可以使用\R
来匹配这两个换行符(以及更多)。
我消除了一些复杂性,因此它不会在每个单元格中强制使用空格:
[+-]+\R+\|(\s*<info>[^<]+<\/info>\s*\|)+\R+[+-]+\R+\|([^|]+\|)+\R+[+-]+
\---/ \------------------------------/ \---/ \----------/ \---/
Line Column Headers Line Contents Line