[英]Split string into array regex php
我需要将字符串拆分为数组键,如下所示:
string = "(731) some text here with number 2 (220) some 54 number other text here"
转换成:
array(
'731' => 'some text here with number 2',
'220' => 'some 54 number other text here'
);
我努力了:
preg_split( '/\([0-9]{3}\)/', $string );
得到了:
array (
0 => 'some text here',
1 => 'some other text here'
);
码
$string = "(731) some text here with number 2 (220) some 54 number other text here";
preg_match_all("/\((\d{3})\) *([^( ]*(?> +[^( ]+)*)/", $string, $matches);
$result = array_combine($matches[1], $matches[2]);
var_dump($result);
产量
array(2) {
[731]=>
string(28) "some text here with number 2"
[220]=>
string(30) "some 54 number other text here"
}
描述
正则表达式使用
\\((\\d{3})\\)
匹配括号中的3位数并捕获它(组1) \\ *
匹配键和值之间的空格 ([^( ]*(?> +[^( ]+)*)
匹配除a之外的所有内容(
并捕获它(第2组)
该子模式与[^(]*(?<! )
完全相同,但基于展开循环技术更有效。
*注意虽然我正在解释一个值字段不能有(
在。如果不是这样的话,请告诉我,我会相应地修改它。
在那之后,我们有$matches[1]
键和$matches[2]
值。 使用array_combine()
我们生成所需的数组。
尝试这个:
$string = "(731) some text here with number 2 (220) some 54 number other text here";
$a = preg_split('/\s(?=\()/', $string);//split by spaces preceding the left bracket
$res = array();
foreach($a as $v){
$r = preg_split('/(?<=\))\s/', $v);//split by spaces following the right bracket
if(isset($r[0]) && isset($r[1])){
$res[trim($r[0],'() ')] = trim($r[1]);//trim brackets and spaces
}
}
print_r($res);
输出:
Array
(
[731] => some text here with number 2
[220] => some 54 number other text here
)
如果您只想将其限制为括号中有3位数的那些数字,只需修改外观:
$a = preg_split('/\s(?=\([0-9]{3}\))/', $string);
你可以尝试这个,
<?php
$str="(731) some text here (220) some other text here";
echo $str .'<br>';
$arr1=explode('(', $str);
$size_arr=count($arr1);
$final_arr=array();
for($i=1;$i<$size_arr; $i++){
$arr2=explode(')', $arr1[$i]);
$final_arr[$arr2[0]]=trim($arr2[1]);
}
echo '<pre>';
print_r($final_arr);
?>
使用此链接测试代码, 单击此处。
我尝试使用简单的语法。 希望大家都明白。
也许你可以在preg_split
添加PREG_SPLIT_DELIM_CAPTURE
标志。 来自preg_split手册页( http://php.net/manual/en/function.preg-split.php )
PREG_SPLIT_DELIM_CAPTURE
如果设置了此标志,则将捕获并返回分隔符模式中的带括号的表达式。
因此,如果您将代码更改为:
$results = preg_split('/\(([0-9]+)\)/s', $data,null,PREG_SPLIT_DELIM_CAPTURE);
您将获得类似于的数组:
Array
(
[0] => KS/M/ 2013/1238
[1] => 220
[2] => 23/12/2013
[3] => 300
[4] =>
[5] => 731
[6] => VALDETE BUZA ADEM JASHARI- PRIZREN, KS
[7] => 526
[8] =>
[9] => 591
[10] =>
[11] => 740
[12] =>
[13] => 540
[14] => DEINA
[15] => 546
[16] =>
[17] => 511
[18] => 3 Preparatet për zbardhim dhe substancat tjera për larje rrobash; preparatet për pastrim, shkëlqim, fërkim dhe gërryerje; sapunët; parfumet, vajrat esencialë, preparatet kozmetike, losionet për flokë, pasta për dhembe
14 Metalet e cmueshme dhe aliazhet e tyre; mallrat në metale të cmueshme ose të veshura me to, që nuk janë përfshire në klasat tjera; xhevahirët, gurët e cmueshëm; instrumentet horologjike dhe kronometrike (për matjen dhe regjistrimin e kohës)
25 Rrobat, këpucët, kapelat
35 Reklamim, menaxhim biznesi; administrim biznesi; funksione zyre
)
在这种情况下,你应该做的是在数组上循环忽略第一个元素:
$myArray = array();
$myKey = '';
foreach ($results as $k => $v) {
if ( ($k > 0) && ($myKey == '')) {
$myKey = $v;
} else if ($k > 0) {
$myArray[$myKey] = $v;
$myKey = '';
}
}
编辑:这个答案是为:
$data ='KS/M/ 2013/1238 (220) 23/12/2013 (300)
(731) VALDETE BUZA ADEM JASHARI- PRIZREN, KS (526)
(591)
(740)
(540) DEINA (546)
(511) 3 Preparatet për zbardhim dhe substancat tjera për larje rrobash; preparatet për pastrim, shkëlqim, fërkim dhe gërryerje; sapunët; parfumet, vajrat esencialë, preparatet kozmetike, losionet për flokë, pasta për dhembe
14 Metalet e cmueshme dhe aliazhet e tyre; mallrat në metale të cmueshme ose të veshura me to, që nuk janë përfshire në klasat tjera; xhevahirët, gurët e cmueshëm; instrumentet horologjike dhe kronometrike (për matjen dhe regjistrimin e kohës)
25 Rrobat, këpucët, kapelat
35 Reklamim, menaxhim biznesi; administrim biznesi; funksione zyre';
我很确定定义键是不可能的,因为正则表达式将连续添加匹配。 我会定义2个正则表达式,一个用于键:
preg_match_all("/(\()([0-9]*)(\))\s/", $input_lines, $output_array);
你会在$ output_array [2]中找到你的钥匙。 一个用于文本(看起来完全相同):
preg_split("/(\()([0-9]*)(\))\s/", $input_line);
之后,您可以构建迭代两者的自定义数组。 插入时务必修剪第二个数组中的字符串。
使用preg_replace_callback()
可以快速实现您的需求(当只有括号包含3位数时):
$string = "(731) some text here with number 2 (220) some 54 number other text here";
$array = array();
preg_replace_callback('~(\((\d{3})\))(.*?)(?=(?1)|\Z)~s', function($match) use (&$array) {
$array[$match[2]] = trim($match[3]);
}, $string);
var_dump($array);
输出:
array(2) {
[731]=>
string(28) "some text here with number 2"
[220]=>
string(30) "some 54 number other text here"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.