我在解析codeigniter中的文本文件时遇到麻烦,对于文件中的每一行,我都需要捕获组数据...数据包括:-渐进编号-运算符-制造商-模型-注册-类型
这是文件行的示例
8 SIRIO S.P.A. BOMBARDIER INC. BD-100-1A10 I-FORZ STANDARD
9 ESERCENTE PRIVATO PIAGGIO AERO INDUSTRIES S.P.A. P.180 AVANTI II I-FXRJ SPECIALE/STANDARD
10 MIGNINI & PETRINI S.P.A. ROBINSON HELICOPTER COMPANY R44 II I-HIKE SPECIALE/STANDARD
11 MIGNINI & PETRINI S.P.A. ROBINSON HELICOPTER COMPANY R44 II I-HIKE STANDARD
12 BLUE PANORAMA AIRLINES S.P.A. THE BOEING COMPANY 737-86N I-LCFC STANDARD
为了解析每一行,我使用以下代码:
if ($fh = fopen($filePath, 'r')) {
while (!feof($fh)) {
$line = trim(fgets($fh));
if(preg_match('/^(\d{1,})\s+(\w{1,})\s+(\w{1,})\s+(\w{1,})\s+(\w{1,})\s+(\w{1,})$/i', $line, $matches))
{
$regs[] = array(
'Operator' => $matches[1],
'Manufacturer' => $matches[2],
'Model' => $matches[3],
'Registration' => $matches[4],
'Type' => $matches[5]
);
$this->data['error'] = FALSE;
}
}
fclose($fh);
}
上面的代码不起作用...我认为是因为某些数据组由一个以上的单词组成...例如“ SIRIO SPA”,是否有任何提示可以解决此问题?非常感谢您的帮助
你不应该使用\w
用于捕捉数据的某些字符在文本一样&
,.
,-
和/
是不是单词字符的一部分。此外,其中一些字符之间\w{1,}
用空格隔开,因此您应该替换掉它们,以\S+(?: \S+)*
将您的文本正确地捕获到已组成的组中。
尝试将您的正则表达式更改为此,它应该可以工作,
^\s*(\d+)\s+(\S+(?: \S+)*)\s+(\S+(?: \S+)*)\s+(\S+(?: \S+)*)\s+(\S+(?: \S+)*)\s+(\S+(?: \S+)*)$
什么解释\S+(?: \S+)*
在上述正则表达式一样。
\S+
-含义\S
相反,\s
它匹配任何非空白字符(不匹配空格或制表符或换行符或垂直空间或水平空间,通常不匹配任何空白)字符。因此\S+
匹配一个或多个可见字符(?: \S+)*
-这?:
仅适用于将一个组转换为非捕获组,并且在其后面有一个空格,\S+
并且所有这些都用量词括在括号中*
。因此,这意味着匹配一个空格,后跟一个或多个非空白字符,并*
使用量词将其整体零次或多次。因此\S+(?: \S+)
将匹配abc
或abc xyz
或abc pqr xyz
等等,但是一旦出现一个以上的空格,该匹配就会停止,因为正则表达式中之前只有一个空格\S+
希望我的解释清楚。如有任何疑问,请随时提出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句