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

preg\u match\u所有项目名称和说明

  •  0
  • user5629061  · 技术社区  · 7 年前

    CAN

    item_name_MyItem1=Nice Title
    item_desc_MyItem1=A short description
    

    MyItem2_item_name=Nice Title
    MyItem2_item_desc=A short description
    

    item_name 但是没有 item_desc

    我想匹配

    • MyItem1
    • desc name
    • =

    Array
    (
        [0] => Array
            (
                [0] => item_name_MyItem1=Nice Title
                [1] => name
                [2] => MyItem1
                [3] => Nice Title
            )
    
        [1] => Array
            (
                [0] => item_desc_MyItem1=A short description
                [1] => desc
                [2] => MyItem1
                [3] => A short description
            )
    
        [2] => Array
            (
                [0] => MyItem2_item_name=Nice Title
                [1] => name
                [2] => MyItem2
                [3] => Nice Title
            )
    
        [3] => Array
            (
                [0] => MyItem2_item_desc=A short description
                [1] => desc
                [2] => MyItem2
                [3] => A short description
            )
    
        // For example: MyItem3 only has a item_name
    
        [4] => Array
            (
                [0] => item_name_MyItem3=Nice Title
                [1] => name
                [2] => MyItem3
                [3] => Nice Title
            )
    )
    

    到目前为止,我有一个正则表达式: ~(?:(.*)_)?item_(name|desc)(?:_(.*))?=(.*)~i' 我用它 PREG_SET_ORDER

    这个正则表达式的问题是,由于optionals,它在每个数组上都有一个空值 (?:(.*)_)? (?:_(.*))?

    希望有人能帮我修复这个正则表达式,使它符合我的预期结果。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Justinas    7 年前

    逐行读取文件并按拆分 =

    $handle = fopen("inputfile.txt", "r");
    $results = [];
    
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            list($name, $desc) = explode('=', $line);
    
            $results[] = [
                $line,
                strpos($name, 'name') !== false ? 'name' : 'desc',
                $name,
                $desc
            ];
        }
    
        fclose($handle);
    } else {
        // error opening the file.
    } 
    
        2
  •  0
  •   mickmackusa Tom Green    7 年前

    贾斯汀的回答让我很困惑。它看起来不应该起作用,所以我会发布一些我认为有效的东西。

    $handle=fopen("inputfile.txt","r");
    if($handle){
        while(($line=fgets($handle))!==false){
            $dyad=explode("=",$line);  // split in two parts
            $attrs=explode("_",$dyad[0]);  // split the first part into 3 parts
            if(strpos('item',$attrs[0])===0){
                $result[]=[$attrs[2],$attrs[1],$dyad[1]];
            }else{
                $result[]=[$attrs[0],$attrs[2],$dyad[1]];
            }
        }
        var_export($result);
        fclose($handle);
    }
    

    demo link with some test data .

        3
  •  -1
  •   trincot Jakube    7 年前

    从中删除内部捕获组

    (.*) => .*

    所以你有:

    ~(?:.*_)?item_(name|desc)(?:_(.*))?=(.*)~i

    但您可以完全删除该前缀,因为它无论如何都是可选的,并且您在那里没有要捕获的内容:

    ~item_(name|desc)(?:_(.*))?=(.*)~i