代码之家  ›  专栏  ›  技术社区  ›  user1512593

PHP正则表达式多个实例

  •  -3
  • user1512593  · 技术社区  · 7 年前

    我目前正在导入CSV数据,需要将其整理好。

    较小的示例数据如下所示。

    "Name","Address"
    "John Doe","5111 Fury Rd
    Santa Cruz"
    "Jane Doe","321 Tess St Texas"
    "Josh Doe","653 1st St 
    Orlando Florida
    United States"
    

    我最初使用这个表达。

    $lines = preg_split('/[\r\n]{1,2}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/',$data);
    

    然而,当字符串中的字符数超过XXXX时,preg_split就把床弄脏了。

    因此,目前诉诸preg\u match\u,但需要正则表达式选择器的问题。

    preg_match_all('/^(.*?)[\r\n]{1,2}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $data, $matches);
    

    当前仅匹配第一个实例。

    Array(
        [0] => Array ( [0] => "Name","Address")
        [1] => Array ( [0] => "Name","Address")
    )
    

    2 回复  |  直到 7 年前
        1
  •  0
  •   Andreas    7 年前

    这里有一种解析它的方法。我已经注释掉了删除地址中新行的部分。如果你想删除评论。

    $re = '/\"(.*?)\",\"(.*?)\"/s';
    $data = '"Name","Address"
    "John Doe","5111 Fury Rd
    Santa Cruz"
    "Jane Doe","321 Tess St Texas"
    "Josh Doe","653 1st St
    Orlando Florida
    United States"';
    
    preg_match_all($re, $data, $matches);
    
    /*
    foreach($matches[2] as &$value){
        $value = str_replace(PHP_EOL, " ", $value);
    }
    */
    var_dump($matches);
    

    https://3v4l.org/7kRDt

    foreach的输出:

    array(3) {
      [0]=>
      array(4) {
        [0]=>
        string(16) ""Name","Address""
        [1]=>
        string(36) ""John Doe","5111 Fury Rd
    Santa Cruz""
        [2]=>
        string(30) ""Jane Doe","321 Tess St Texas""
        [3]=>
        string(53) ""Josh Doe","653 1st St
    Orlando Florida
    United States""
      }
      [1]=>
      array(4) {
        [0]=>
        string(4) "Name"
        [1]=>
        string(8) "John Doe"
        [2]=>
        string(8) "Jane Doe"
        [3]=>
        string(8) "Josh Doe"
      }
      [2]=>
      array(4) {
        [0]=>
        string(7) "Address"
        [1]=>
        string(23) "5111 Fury Rd Santa Cruz"
        [2]=>
        string(17) "321 Tess St Texas"
        [3]=>
        &string(40) "653 1st St Orlando Florida United States"
      }
    }
    
        2
  •  0
  •   Darragh Enright    7 年前

    preg_match_all() 您可以尝试使用此模式创建一个匹配数组,然后映射 str_getcsv() 超过结果;例如:

    <?php
    
    $csvString = <<<CSV
    "Name","Address"
    "John Doe","5111 Fury Rd
    Santa Cruz"
    "Jane Doe","321 Tess St Texas"
    "Josh Doe","653 1st St
    Orlando Florida
    United States
    CSV;
    
    
    preg_match_all('/(.*)(?:\n)/m', $csvString, $csvRows);
    
    $csvData = array_map(function ($csvRow) {
        return str_getcsv($csvRow);
    }, $csvRows[1]);
    
    print_r($csvData);
    

    Array
    (
        [0] => Array
            (
                [0] => Name
                [1] => Address
            )
    
        [1] => Array
            (
                [0] => John Doe
                [1] => 5111 Fury Rd
            )
    
        [2] => Array
            (
                [0] => Santa Cruz"
            )
    
        [3] => Array
            (
                [0] => Jane Doe
                [1] => 321 Tess St Texas
            )
    
        [4] => Array
            (
                [0] => Josh Doe
                [1] => 653 1st St
            )
    
        [5] => Array
            (
                [0] => Orlando Florida
            )
    
    )
    

    希望这有帮助:)