我的客户订单中有一个非常大的.txt文件,我需要在mysql数据库中移动它。但是我不知道使用什么样的正则表达式,因为信息差别不大。
----------------------- 4046904 KKKKKKKKKKK Laura Meyer MassMutual Life Insurance 153 Vadnais Street Chicopee, MA 01020 US 413-744-5452 lmeyer@massmutual.co... KKKKKKKKKKK 373074210772222 02/12 6213 NA ----------------------- 4046907 KKKKKKKKKKK Venkat Talladivedula 6105 West 68th Street Tulsa, OK 74131 US 9184472611 venkat.talladivedula... KKKKKKKKKKK 373022121440000 06/11 9344 NA -----------------------
我尝试了一些东西,但我甚至无法提取名称......这是我努力的样本,没有成功
$htmlContent = file_get_contents("orders.txt"); //print_r($htmlContent); $pattern = "/KKKKKKKKKKK(.*)\n/s"; preg_match_all($pattern, $htmlContent, $matches); print_r($matches); $name = $matches[1][0]; echo $name;
答案 0 :(得分:4)
您可能希望避免像这样的事情的正则表达式。由于数据是按行清楚地组织的,因此您可以使用fgets()重复读取行并以这种方式解析数据。
答案 1 :(得分:0)
您可以使用正则表达式阅读此文件,但它可能非常复杂,创建一个可以读取所有字段的正则表达式。
我建议您逐行读取此文件,并解析每个文件,检测它包含哪种数据。
答案 2 :(得分:0)
如果你确切知道你的数据在哪里(即它的哪一行),为什么不这样做呢?
即。
之类的东西$htmlContent = file_get_contents("orders.txt");
$arrayofclients = explode("-----------------------",$htmlContent);
$newlinesep = "\r\n";
for($i = 0;i < count($arrayofclients);$i++)
{
$temp = explode($newlinesep,$arrayofclients[i]);
$idnum = $temp[0];
$name = $temp[4];
$houseandstreet = $temp[6];
//etc
}
或者只是使用fgets()逐行读取文件 - 例如:
$i = 0;$j = 0;
$file = fopen("orders.txt","r");
$clients = [];
while ($line = fgets($ffile) )
{
if(line != false)
{
$i++;
switch($i)
{
case 2:
$clients[$j]["idnum"] = $line;
break;
case 6:
$clients[$j]["name"] = $line;
break;
//add more cases here for each line up to:
case 18:
$j++;
$i = 0;
break;
//there are 18 lines per client if i counted right, so increment $j and reset $i.
}
}
}
fclose ($f);
你可以使用正则表达式,但对于这种情况他们有点尴尬。
尼科
答案 3 :(得分:0)
对于记录,这里是为您捕获名称的正则表达式。 (授予速度非常好可能是一个问题。)
(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-)
说明:
(?<=K{10}\s{2}) #Positive lookbehind for KKKKKKKKKK then 2 return/newline characters
\K[^\r\n]++ #Greedily match 1 or more non-return/newline characters
(?!\s{2}-) #Negative lookahead for return/newline character then dash
这是Regex Demo。
你会注意到我的正则表达式模式在Regex Demo和我的PHP Demo之间略有变化。可能需要根据环境进行轻微调整以匹配返回/换行符。
这是php实现(Demo):
if(preg_match_all("/(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-)/",$htmlContent,$matches)){
var_export($matches[0]);
}else{
echo "no matches";
}
在我的模式中使用\K
我避免实际上必须用括号捕获。这将数组大小减少了50%,对许多项目来说都是一个有用的技巧。 \K
基本上表示&#34;从这一点开始全字符串匹配&#34;,所以匹配进入$matches
的第一个子数组(fullstrings,key = 0),而不是生成全字符串匹配在0
中,以及1
中的捕获。
输出:
array (
0 => 'Laura Meyer',
1 => 'Venkat Talladivedula',
)