php,preg_match,regex,提取特定文本

时间:2010-10-24 22:47:53

标签: php regex preg-match-all

我的客户订单中有一个非常大的.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;

4 个答案:

答案 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',
)