preg_match_all 循环每个匹配项,验证是否为空以设置空值以插入 table mysql

preg_match_all loop for each match, verify if empty to set null values to insert in table mysql

我有 10 行要与其他行一起从文件文本中提取,有些是空的但存在,有些不存在但无论如何我都必须插入它们,正则表达式可以将文本分成 10 组,我使用 preg_match_all 来匹配组并生成一个匹配的数组,但如果不存在不匹配的行,我希望插入值组插入 mysql table 中,如果值为空,则设置 NULL。

我只需要它们的值,但首先验证键是否存在并为此添加缺失的键和 NULL 值。

如果值为空设置NULL,如果组在文本文件中不存在添加一个值设置一个NULL插入到table mysql.

请参阅更新问题

我应该使用 array_push、array_key_exists 还是在正则表达式中按每个组分配一个名称?

最后,如何循环每场比赛?使用 preg_match_all 只生成一个完全匹配的数组,但我的 table mysql 只有 10 列,每个组正则表达式一个。

更新问题:我改写了 post 11/24/21 01.00

例如完整数据是10行

/*
First Name         :NameAAAAAA
LINE TO EXCLUDE    : this line is to exclude     
Last Name          :LastAAAAAA
LINE TO EXCLUDE    : this line is to exclude
Gender = (F/M)     :
ANOTHER LINE TO EXCLUDE : this line is to exclude                             
        TEST INFO 1      :TI1AAAAAA
        ANOTHER LINE TO EXCLUDE  : this line is to exclude             
        TEST INFO 2      :       
        TEST INFO 3      :TI3AAAAAA
First Name         :NameBBBBBB
LINE TO EXCLUDE    : this line is to exclude     
Last Name          :LastBBBBBB
LINE TO EXCLUDE    : this line is to exclude
Gender = (F/M)     :
First Name         :NameCCCCCC
LINE TO EXCLUDE    : this line is to exclude     
Last Name          :LastCCCCCC
LINE TO EXCLUDE    : this line is to exclude
Gender = (F/M)     :M
ANOTHER LINE TO EXCLUDE : this line is to exclude                             
        TEST INFO 1      :
        ANOTHER LINE TO EXCLUDE  : this line is to exclude             
        TEST INFO 2      :TI2CCCCCC       
        TEST INFO 3      :
*/

使用正则表达式仅提取行(6 行):

https://regex101.com/r/hWzvOr/1

/.*(?:First Name).*|.*(?:Last Name).*|.*(?:Gender = \(F\/M\)).*|.*(?:TEST INFO 1).*|.*(?:TEST INFO 2).*|.*(?:TEST INFO 3).*/g

使用正则表达式模式提取后的以下字符串:可能发现行不存在(请参阅 NameBBBBBB 组中的测试信息 1-2-3)

$str = '
First Name         :NameAAAAAA    
Last Name          :LastAAAAAA                 
Gender = (F/M)     :                            
        TEST INFO 1   :TI1AAAAAA     
        TEST INFO 2   :       
        TEST INFO 3   :TI3AAAAAA  
First Name         :NameBBBBBB   
Last Name          :LastBBBBBB                 
Gender = (F/M)     :                                                                                 
First Name         :NameCCCCCC   
Last Name          :LastCCCCCC                 
Gender = (F/M)     :M                            
        TEST INFO 1   :     
        TEST INFO 2   :TI2CCCCCC       
        TEST INFO 3   : 
';

如果不存在(不匹配)通过动态创建键并将值设置为 NULL,如果值为空则设置为 NULL。

必须生成,(参见 NameBBBBBB 组中的测试信息 1-2-3)

Array
(
    [0] => Array
        (
            [0] => First Name         :NameAAAAAA    
            [1] => Last Name          :LastAAAAAA                 
            [2] => Gender = (F/M)     :                            
            [3] =>         TEST INFO 1   :TI1AAAAAA     
            [4] =>         TEST INFO 2   :       
            [5] =>         TEST INFO 3   :TI3AAAAAA 
            [6] => First Name         :NameBBBBBB    
            [7] => Last Name          :LastBBBBBB                 
            [8] => Gender = (F/M)     : 
            [9] =>         TEST INFO 1   :                        
            [10] =>        TEST INFO 2   :
            [11] =>        TEST INFO 3   :                             
            [12] => First Name         :NameCCCCCC    
            [13] => Last Name          :LastCCCCCC                 
            [14] => Gender = (F/M)     : M                           
            [15] =>         TEST INFO 1   :                        
            [16] =>         TEST INFO 2   :TI2CCCCCC
            [17] =>         TEST INFO 3   :                                          
        )

)

如果在正则表达式中不匹配,如何创建键?循环生成一个包含所有数据的数组,但我将每个循环 6 行值插入一个 table 中,其中 6 列插入 mysql?

提前致谢。

此致。

意大利。

  1. 构建一个数组,将所有需要的键和值设置为空:
$columns = [
    'APPLICATION ID',
    'STATUS P=PENDING/A=ACTIVE',
    /*...*/
    'RUN CYCLE DESCRIPTION'
];

$keys = array_fill_keys($columns, null);
  1. 构建一个模式来提取字符串中存在的键和值。为此,将所有需要的键放入您的模式中是完全没用的,您只需要使用捕获组(在此处命名)将键与每个匹配项的值隔离(请注意 value组是可选的):
$pat = '~^ \h*+ (?<key> [^:\n]* [^:\s] ) \h* : (?<value> \S+ (?:\h+\S+)* )? ~xm';
  1. preg_match_allPREG_UNMATCHED_AS_NULL标志一起使用:当可选的组不匹配时,返回值为null一个空字符串。
    使用 preg_match_all 匹配结果,构建一个包含 $matches['key']$matches['value'] 子数组的关联数组(请注意,这个数组与数组 $keys 具有相同的键,除了最终一些键都不见了)。
    然后你所要做的就是将 $keys 数组与这个新数组合并,以获得一个包含你感兴趣的 key/value 对的关联数组。
if ( preg_match_all($pat, $yourstring, $matches, PREG_UNMATCHED_AS_NULL) ) {
    $result = array_combine($matches['key'], $matches['value']);
    // $result = array_intersect_key($result, $keys); // if you need to exclude some key/value pairs from the string
    $result = array_merge($keys, $result);
}

1,2,3 Aquafresh® 3

我会分多个步骤进行处理:

$str = '
      APPLICATION ID                   :AAAAA#AA#0101       
      STATUS P=PENDING/A=ACTIVE        :A                    
      VALID-TO DATE                    :711231               
      APPLICATION TYPE (A/G)           :A                    
      DESCRIPTIVE TEXT                 :DESC folder AAAAA    
      OWNER ID                         :               
      RANDOM INFO                      :                     
            PERIOD OR RUN CYCLE GROUP NAME   :QAZ123XX        
            RUN CYCLE VALID-FROM             :711230          
            RUN CYCLE VALID-TO               :711231          
            RUN CYCLE DESCRIPTION            :MANUAL ORDER    
            RUN RANDOM IFO                   :                
      APPLICATION ID                   :BBBBB#BB#0101       
      STATUS P=PENDING/A=ACTIVE        :A                    
      VALID-TO DATE                    :711231               
      APPLICATION TYPE (A/G)           :A                    
      DESCRIPTIVE TEXT                 :                     
      OWNER ID                         :OWNER1               
      RANDOM INFO                      :                     
';

加上

$groups = explode('APPLICATION ID', $str);
foreach ($groups as $group) {
    echo "----\n";
    $hash = [];
    if (empty($group)) continue;
    $group = 'APPLICATION ID' . $group;
    $lines = preg_split("/\n/", $group);
    foreach($lines as $line) {
        $kv = explode(':', $line);
       if (count($kv) == 2 && trim($kv[1]) != '')
            $hash[trim($kv[0])] = trim($kv[1]);
    }
    print_r($hash);

    // TODO:  Build an INSERT with just the values in $hash
    // Meanwhile, each column should be `DEFAULT NULL`.
}

产量:

----
Array
(
)
----
Array
(
    [APPLICATION ID] => AAAAA#AA#0101
    [STATUS P=PENDING/A=ACTIVE] => A
    [VALID-TO DATE] => 711231
    [APPLICATION TYPE (A/G)] => A
    [DESCRIPTIVE TEXT] => DESC folder AAAAA
    [PERIOD OR RUN CYCLE GROUP NAME] => QAZ123XX
    [RUN CYCLE VALID-FROM] => 711230
    [RUN CYCLE VALID-TO] => 711231
    [RUN CYCLE DESCRIPTION] => MANUAL ORDER
)
----
Array
(
    [APPLICATION ID] => BBBBB#BB#0101
    [STATUS P=PENDING/A=ACTIVE] => A
    [VALID-TO DATE] => 711231
    [APPLICATION TYPE (A/G)] => A
    [OWNER ID] => OWNER1
)

另一个提示:NULLIF(?, '')