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?
提前致谢。
此致。
意大利。
- 构建一个数组,将所有需要的键和值设置为空:
$columns = [
'APPLICATION ID',
'STATUS P=PENDING/A=ACTIVE',
/*...*/
'RUN CYCLE DESCRIPTION'
];
$keys = array_fill_keys($columns, null);
- 构建一个模式来提取字符串中存在的键和值。为此,将所有需要的键放入您的模式中是完全没用的,您只需要使用捕获组(在此处命名)将键与每个匹配项的值隔离(请注意 value组是可选的):
$pat = '~^ \h*+ (?<key> [^:\n]* [^:\s] ) \h* : (?<value> \S+ (?:\h+\S+)* )? ~xm';
- 将
preg_match_all
与PREG_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(?, '')
我有 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?
提前致谢。
此致。
意大利。
- 构建一个数组,将所有需要的键和值设置为空:
$columns = [
'APPLICATION ID',
'STATUS P=PENDING/A=ACTIVE',
/*...*/
'RUN CYCLE DESCRIPTION'
];
$keys = array_fill_keys($columns, null);
- 构建一个模式来提取字符串中存在的键和值。为此,将所有需要的键放入您的模式中是完全没用的,您只需要使用捕获组(在此处命名)将键与每个匹配项的值隔离(请注意 value组是可选的):
$pat = '~^ \h*+ (?<key> [^:\n]* [^:\s] ) \h* : (?<value> \S+ (?:\h+\S+)* )? ~xm';
- 将
preg_match_all
与PREG_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(?, '')