【问题标题】:php, preg_match, regex, extract specific textphp, preg_match, regex, 提取特定文本
【发布时间】:2010-10-24 22:47:53
【问题描述】:

我有一个非常大的 .txt 文件与我们的客户订单,我需要将它移动到一个 mysql 数据库中。但是我不知道要使用什么样的正则表达式,因为信息并没有太大的不同。

---------------------- 4046904 KKKKKKKKKK 劳拉·迈耶 万通人寿保险 瓦德奈街 153 号 马萨诸塞州奇科皮 01020 我们 413-744-5452 lmeyer@massmutual.co... KKKKKKKKKK 373074210772222 02/12 6213 不适用 ---------------------- 4046907 KKKKKKKKKK 文卡特塔拉迪维杜拉 西 68 街 6105 号 塔尔萨,OK 74131 我们 9184472611 venkat.talladivedula... KKKKKKKKKK 373022121440000 06/11 9344 不适用 ----------------------

我尝试了一些东西,但我什至无法提取名称...这是我的努力示例,但没有成功

$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]; 回声$名称;

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    您可能希望避免使用正则表达式来处理此类问题。由于数据清楚地按行组织,因此您可以使用 fgets() 重复读取行并以这种方式解析数据。

    【讨论】:

    • 第二。这看起来更像是 fgets()file() 的工作,然后遍历每一行以提取单个记录。
    【解决方案2】:

    您可以使用正则表达式读取此文件,但创建一个可以读取所有字段的正则表达式可能会非常复杂。

    我建议您逐行阅读此文件,并解析每个文件,检测其中包含哪种数据。

    【讨论】:

      【解决方案3】:

      既然您确切地知道您的数据在哪里(即它在哪一行),为什么不直接获取它呢?

      即像

      $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);
      

      您可以使用正则表达式,但在这种情况下它们有点尴尬。

      妮可

      【讨论】:

        【解决方案4】:

        为了记录,这里是将为您捕获名称的正则表达式。 (授予的速度很好可能是个问题。)

        (?<=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 基本上说“从这一点开始全字符串匹配”,因此匹配进入 $matches 的第一个子数组(全字符串,键 = 0),而不是在 0 中生成全字符串匹配并在 @ 中捕获987654330@.

        输出:

        array (
          0 => 'Laura Meyer',
          1 => 'Venkat Talladivedula',
        )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          相关资源
          最近更新 更多