Php 创建正则表达式模式以匹配空格分隔的字符串
我有很多行的文件(超过32k)。行看起来像:Php 创建正则表达式模式以匹配空格分隔的字符串,php,regex,Php,Regex,我有很多行的文件(超过32k)。行看起来像: 34 Item 5423 11Item 44 Item 第一个数字是IDs。我想制作关联数组:数组(“34”=>“项”,“5423”=>“11项”,“44”=>“项”) ID的长度可以是1到5(1-65366) 项目名称可以以数字开头 ID和项目名称之间至少有一个(但可以不止一个)空格 所以,主要的区别是空间或一定数量的空间。使用PHP。使用 i、 e 它将返回一个字符串数组。使用 i、 e 它将返回一个字符串数组。使用 i、 e 它将返回一
34 Item
5423 11Item
44 Item
第一个数字是IDs。我想制作关联数组:数组(“34”=>“项”,“5423”=>“11项”,“44”=>“项”)
它将返回一个字符串数组。这里有一个方法,它不检查数据的有效性,但可能有效。它根据空格分解每一行,并将结果放入
$res
关联数组中。有关信息,允许使用正则表达式拆分字符串
$res = array();
foreach($lines as $line) {
$data = preg_split('/\s+/', $line);
$res[$data[0]] = $data[1];
}
如果您确实想检查您的条件,您可以添加一些If
语句,ID限制为:
$res = array();
foreach($lines as $line) {
$data = preg_split('/\s+/', $line);
$idx = intval($data[0]);
if($idx > 0 && $idx < 65366) // skip lines where the ID seems invalid
$res[$data[0]] = $data[1];
}
$res=array();
foreach($line作为$line){
$data=preg_split('/\s+/',$line);
$idx=intval($data[0]);
if($idx>0&&$idx<65366)//跳过ID似乎无效的行
$res[$data[0]]=$data[1];
}
这里有一种方法,它不检查数据的有效性,但可能有效。它根据空格分解每一行,并将结果放入$res
关联数组中。有关信息,允许使用正则表达式拆分字符串
$res = array();
foreach($lines as $line) {
$data = preg_split('/\s+/', $line);
$res[$data[0]] = $data[1];
}
如果您确实想检查您的条件,您可以添加一些If
语句,ID限制为:
$res = array();
foreach($lines as $line) {
$data = preg_split('/\s+/', $line);
$idx = intval($data[0]);
if($idx > 0 && $idx < 65366) // skip lines where the ID seems invalid
$res[$data[0]] = $data[1];
}
$res=array();
foreach($line作为$line){
$data=preg_split('/\s+/',$line);
$idx=intval($data[0]);
if($idx>0&&$idx<65366)//跳过ID似乎无效的行
$res[$data[0]]=$data[1];
}
这里有一种方法,它不检查数据的有效性,但可能有效。它根据空格分解每一行,并将结果放入$res
关联数组中。有关信息,允许使用正则表达式拆分字符串
$res = array();
foreach($lines as $line) {
$data = preg_split('/\s+/', $line);
$res[$data[0]] = $data[1];
}
如果您确实想检查您的条件,您可以添加一些If
语句,ID限制为:
$res = array();
foreach($lines as $line) {
$data = preg_split('/\s+/', $line);
$idx = intval($data[0]);
if($idx > 0 && $idx < 65366) // skip lines where the ID seems invalid
$res[$data[0]] = $data[1];
}
$res=array();
foreach($line作为$line){
$data=preg_split('/\s+/',$line);
$idx=intval($data[0]);
if($idx>0&&$idx<65366)//跳过ID似乎无效的行
$res[$data[0]]=$data[1];
}
这里有一种方法,它不检查数据的有效性,但可能有效。它根据空格分解每一行,并将结果放入$res
关联数组中。有关信息,允许使用正则表达式拆分字符串
$res = array();
foreach($lines as $line) {
$data = preg_split('/\s+/', $line);
$res[$data[0]] = $data[1];
}
如果您确实想检查您的条件,您可以添加一些If
语句,ID限制为:
$res = array();
foreach($lines as $line) {
$data = preg_split('/\s+/', $line);
$idx = intval($data[0]);
if($idx > 0 && $idx < 65366) // skip lines where the ID seems invalid
$res[$data[0]] = $data[1];
}
$res=array();
foreach($line作为$line){
$data=preg_split('/\s+/',$line);
$idx=intval($data[0]);
if($idx>0&&$idx<65366)//跳过ID似乎无效的行
$res[$data[0]]=$data[1];
}
与命名捕获组一起使用:
preg_match('/^(?<id>\d+)\s+(?<name>[\w ]+)$/', $row, $matches);
示例输出:
Array
(
[34] => Item
[5423] => 11Item
[44] => Item
[3470] => BLABLA TEF2200
)
与命名的捕获组一起使用:
preg_match('/^(?<id>\d+)\s+(?<name>[\w ]+)$/', $row, $matches);
示例输出:
Array
(
[34] => Item
[5423] => 11Item
[44] => Item
[3470] => BLABLA TEF2200
)
与命名的捕获组一起使用:
preg_match('/^(?<id>\d+)\s+(?<name>[\w ]+)$/', $row, $matches);
示例输出:
Array
(
[34] => Item
[5423] => 11Item
[44] => Item
[3470] => BLABLA TEF2200
)
与命名的捕获组一起使用:
preg_match('/^(?<id>\d+)\s+(?<name>[\w ]+)$/', $row, $matches);
示例输出:
Array
(
[34] => Item
[5423] => 11Item
[44] => Item
[3470] => BLABLA TEF2200
)
您可以使用以下功能:
$data = <<<'LOD'
34 Item
5423 11Item
44 Item
546
65535 toto le héros
65536 belzebuth
glups glips
LOD;
$result = array();
$line = strtok($data, "\r\n");
while($line!==false) {
$tmp = preg_split('~\s+~', $line, 2, PREG_SPLIT_NO_EMPTY);
if (count($tmp)==2 && $tmp[0]==(string)(int)$tmp[0] && $tmp[0]<65536)
$result[$tmp[0]] = $tmp[1];
$line = strtok("\r\n");
}
print_r($result);
$data=您可以使用:
$data = <<<'LOD'
34 Item
5423 11Item
44 Item
546
65535 toto le héros
65536 belzebuth
glups glips
LOD;
$result = array();
$line = strtok($data, "\r\n");
while($line!==false) {
$tmp = preg_split('~\s+~', $line, 2, PREG_SPLIT_NO_EMPTY);
if (count($tmp)==2 && $tmp[0]==(string)(int)$tmp[0] && $tmp[0]<65536)
$result[$tmp[0]] = $tmp[1];
$line = strtok("\r\n");
}
print_r($result);
$data=您可以使用:
$data = <<<'LOD'
34 Item
5423 11Item
44 Item
546
65535 toto le héros
65536 belzebuth
glups glips
LOD;
$result = array();
$line = strtok($data, "\r\n");
while($line!==false) {
$tmp = preg_split('~\s+~', $line, 2, PREG_SPLIT_NO_EMPTY);
if (count($tmp)==2 && $tmp[0]==(string)(int)$tmp[0] && $tmp[0]<65536)
$result[$tmp[0]] = $tmp[1];
$line = strtok("\r\n");
}
print_r($result);
$data=您可以使用:
$data = <<<'LOD'
34 Item
5423 11Item
44 Item
546
65535 toto le héros
65536 belzebuth
glups glips
LOD;
$result = array();
$line = strtok($data, "\r\n");
while($line!==false) {
$tmp = preg_split('~\s+~', $line, 2, PREG_SPLIT_NO_EMPTY);
if (count($tmp)==2 && $tmp[0]==(string)(int)$tmp[0] && $tmp[0]<65536)
$result[$tmp[0]] = $tmp[1];
$line = strtok("\r\n");
}
print_r($result);
$data=Why not$cont=file\u get\u contents($file);preg_match_all('/^(?\d+)\s+(?\w+)$/m',$cont,$matches)代码>?@SharanyaDutta:有超过32K行(正如他在问题中所说的),所以速度可能会很慢。如果他已经遍历了所有行,preg\u match()
会更合适。非常感谢。它在一种情况下工作良好,但不正确:当字符串以数字结尾时。例如:3470 BLABLA TEF2200 In$matches['id']我得到:。。。3470 2200 ... 但应该只有3470@MaximDroy:啊。我也更新了正则表达式来处理空格。我还添加了一个示例和一个演示,以帮助您更好地理解它。干杯为什么不$cont=file\u get\u contents($file);preg_match_all('/^(?\d+)\s+(?\w+)$/m',$cont,$matches)代码>?@SharanyaDutta:有超过32K行(正如他在问题中所说的),所以速度可能会很慢。如果他已经遍历了所有行,preg\u match()
会更合适。非常感谢。它在一种情况下工作良好,但不正确:当字符串以数字结尾时。例如:3470 BLABLA TEF2200 In$matches['id']我得到:。。。3470 2200 ... 但应该只有3470@MaximDroy:啊。我也更新了正则表达式来处理空格。我还添加了一个示例和一个演示,以帮助您更好地理解它。干杯为什么不$cont=file\u get\u contents($file);preg_match_all('/^(?\d+)\s+(?\w+)$/m',$cont,$matches)代码>?@SharanyaDutta:有超过32K行(正如他在问题中所说的),所以速度可能会很慢。如果他已经遍历了所有行,preg\u match()
会更合适。非常感谢。它在一种情况下工作良好,但不正确:当字符串以数字结尾时。例如:3470 BLABLA TEF2200 In$matches['id']我得到:。。。3470 2200 ... 但应该只有3470@MaximDroy:啊。我也更新了正则表达式来处理空格。我还添加了一个示例和一个演示,以帮助您更好地理解它。干杯为什么不$cont=file\u get\u contents($file);preg_match_all('/^(?\d+)\s+(?\w+)$/m',$cont,$matches)代码>?@SharanyaDutta:有超过32K行(正如他在问题中所说的),所以速度可能会很慢。如果他已经遍历了所有行,preg\u match()
会更合适。非常感谢。它在一种情况下工作良好,但不正确:当字符串以数字结尾时。例如:3470废话