preg_split如何使用php将分隔符转换为索引
我在PHP中使用了以下字符串:preg_split如何使用php将分隔符转换为索引,php,regex,preg-split,Php,Regex,Preg Split,我在PHP中使用了以下字符串: *nJohn*sSmith*fGeorge#*nHenry*sFord 并希望使用创建一个数组 [姓名],[姓氏],[父亲]作为索引,因此它将生成 name_array[1] = ( [name] => 'John', [surname] => 'Smith', [fathers] => 'George' ) name_array[2]=( [name] => 'Henry', [surname] =>
*nJohn*sSmith*fGeorge#*nHenry*sFord
并希望使用创建一个数组
[姓名],[姓氏],[父亲]作为索引,因此它将生成
name_array[1] = (
[name] => 'John',
[surname] => 'Smith',
[fathers] => 'George'
)
name_array[2]=(
[name] => 'Henry',
[surname] => 'Ford'
)
等等。
如何在PHP中使用preg_split来实现它??
谢谢 我会用它来取名字。如果字符串一致,我认为您可以:
$string = '*nJohn*sSmith*fGeorge#*nHenry*sFord';
preg_match_all('/\*n(?<givenname>.*?)\*s(?<surname>.*?)(?:\*f(?<middlename>.*?))?(?:#|$)/', $string, $matches);
print_r($matches);
$string='*nJohn*sSmith*fGeorge#*nHenry*sFord';
preg\u match \u all('/\*n(?.*?\*s(?.*?)(?:\*f(?.*?)/',$string,$matches);
打印(匹配项);
正则表达式演示:
PHP演示:我将使用它来获取名称。如果字符串一致,我认为您可以:
$string = '*nJohn*sSmith*fGeorge#*nHenry*sFord';
preg_match_all('/\*n(?<givenname>.*?)\*s(?<surname>.*?)(?:\*f(?<middlename>.*?))?(?:#|$)/', $string, $matches);
print_r($matches);
$string='*nJohn*sSmith*fGeorge#*nHenry*sFord';
preg\u match \u all('/\*n(?.*?\*s(?.*?)(?:\*f(?.*?)/',$string,$matches);
打印(匹配项);
正则表达式演示:
PHP演示:不使用正则表达式的解决方案:
$string = '*nJohn*sSmith*fGeorge#*nHenry*sFord';
$result = array();
$persons = explode('#', $string);
foreach ($persons as $person) {
$identials = explode('*', $person);
unset($r);
foreach ($identials as $idential) {
if(!$idential){
continue; //empty string
}
switch ($idential[0]) { //first character
case 'n':
$key = 'name';
break;
case 's':
$key = 'surename';
break;
case 'f':
$key = 'fathers';
break;
}
$r[$key] = substr($idential, 1);
}
$result[] = $r;
}
不使用正则表达式的解决方案:
$string = '*nJohn*sSmith*fGeorge#*nHenry*sFord';
$result = array();
$persons = explode('#', $string);
foreach ($persons as $person) {
$identials = explode('*', $person);
unset($r);
foreach ($identials as $idential) {
if(!$idential){
continue; //empty string
}
switch ($idential[0]) { //first character
case 'n':
$key = 'name';
break;
case 's':
$key = 'surename';
break;
case 'f':
$key = 'fathers';
break;
}
$r[$key] = substr($idential, 1);
}
$result[] = $r;
}
此函数将生成您想要的结果!但认为这不是唯一的方式,不是100%正确的方式!我按照你的要求使用了preg_split
function splitMyString($str){
$array_names = [];
$mainString = explode('#', $str);
$arr1 = preg_split("/\*[a-z]/", $mainString[0]);
unset($arr1[0]);
$arr1_values = array_values($arr1);
$arr1_keys = ['name','surname','fathers'];
$result1 = array_combine($arr1_keys, $arr1_values);
// second part of string
$arr2 = preg_split("/\*[a-z]/", $mainString[1]);
unset($arr2[0]);
$arr2_values = array_values($arr2);
$arr2_keys = ['name','surname'];
$arr2 = array_combine($arr2_keys, $arr2_values);
$array_names[] = $arr1;
$array_names[] = $arr2;
return $array_names;
}
// test result !
print_r(splitMyString("*nJohn*sSmith*fGeorge#*nHenry*sFord"));
此函数将生成您想要的结果!但认为这不是唯一的方式,不是100%正确的方式!我按照你的要求使用了preg_split
function splitMyString($str){
$array_names = [];
$mainString = explode('#', $str);
$arr1 = preg_split("/\*[a-z]/", $mainString[0]);
unset($arr1[0]);
$arr1_values = array_values($arr1);
$arr1_keys = ['name','surname','fathers'];
$result1 = array_combine($arr1_keys, $arr1_values);
// second part of string
$arr2 = preg_split("/\*[a-z]/", $mainString[1]);
unset($arr2[0]);
$arr2_values = array_values($arr2);
$arr2_keys = ['name','surname'];
$arr2 = array_combine($arr2_keys, $arr2_values);
$array_names[] = $arr1;
$array_names[] = $arr2;
return $array_names;
}
// test result !
print_r(splitMyString("*nJohn*sSmith*fGeorge#*nHenry*sFord"));
谢谢大家!
出于某种原因,该网站出于某种“声誉”原因阻止了我的投票,我发现这并不完全符合民主!另一方面,现在谁关心民主!
尽管如此,我还是使用了解决方案2,但没有指出解决方案1或3并不好!
问候
不管你的回答如何启发我,我也想到了我的答案,就是这里
$string = '*nJohn*sSmith*fGeorge#*nHenry*sFord';
split_to_key ( $string, array('n'=>'Name','s'=>'Surname','f'=>'Middle'));
function split_to_key ( $string,$ind=array() )
{
$far=null;
$i=0;
$fbig=preg_split('/#/',$string,-1,PREG_SPLIT_NO_EMPTY);
foreach ( $fbig as $fsmall ) {
$f=preg_split('/\*/u',$fsmall,-1,PREG_SPLIT_NO_EMPTY);
foreach ( $f as $fs ) {
foreach( array_keys($ind) as $key ) {
if( preg_match ('/^'.$key.'/u',$fs ) ) {
$fs=preg_replace('/^'.$key.'/u','',$fs);
$far[$i][$ind[$key]]=$fs;
}
}
}
$i++;
}
print_r($far);
}
谢谢大家!
出于某种原因,该网站出于某种“声誉”原因阻止了我的投票,我发现这并不完全符合民主!另一方面,现在谁关心民主!
尽管如此,我还是使用了解决方案2,但没有指出解决方案1或3并不好!
问候
不管你的回答如何启发我,我也想到了我的答案,就是这里
$string = '*nJohn*sSmith*fGeorge#*nHenry*sFord';
split_to_key ( $string, array('n'=>'Name','s'=>'Surname','f'=>'Middle'));
function split_to_key ( $string,$ind=array() )
{
$far=null;
$i=0;
$fbig=preg_split('/#/',$string,-1,PREG_SPLIT_NO_EMPTY);
foreach ( $fbig as $fsmall ) {
$f=preg_split('/\*/u',$fsmall,-1,PREG_SPLIT_NO_EMPTY);
foreach ( $f as $fs ) {
foreach( array_keys($ind) as $key ) {
if( preg_match ('/^'.$key.'/u',$fs ) ) {
$fs=preg_replace('/^'.$key.'/u','',$fs);
$far[$i][$ind[$key]]=$fs;
}
}
}
$i++;
}
print_r($far);
}
像Chris一样,我不会使用
preg\u split()
。我的方法只使用一个preg()
函数和一个循环来完全准备所需格式的过滤输出(注意,我的输出是0索引的)
输入(我扩展了您的输入样本以进行测试):
方法(&):
输出:
array (
0 =>
array (
'name' => 'John',
'surname' => 'Smith',
'father' => 'George',
),
1 =>
array (
'name' => 'Henry',
'surname' => 'Ford',
),
2 =>
array (
'name' => 'James',
'surname' => 'Washington',
),
3 =>
array (
'name' => 'Mary',
'surname' => 'Miller',
'father' => 'Richard',
),
)
我的正则表达式模式通过使用“负字符类”来优化速度。我选择不使用命名的捕获组,因为它们的输出数组大小几乎是
preg\u match\u all()
的两倍,而且该数组需要进一步准备。与Chris一样,我不会使用preg\u split()
。我的方法只使用一个preg()
函数和一个循环来完全准备所需格式的过滤输出(注意,我的输出是0索引的)
输入(我扩展了您的输入样本以进行测试):
方法(&):
输出:
array (
0 =>
array (
'name' => 'John',
'surname' => 'Smith',
'father' => 'George',
),
1 =>
array (
'name' => 'Henry',
'surname' => 'Ford',
),
2 =>
array (
'name' => 'James',
'surname' => 'Washington',
),
3 =>
array (
'name' => 'Mary',
'surname' => 'Miller',
'father' => 'Richard',
),
)
我的正则表达式模式通过使用“负字符类”来优化速度。我选择不使用命名的捕获组,因为它们的输出数组大小几乎是
preg\u match\u all()
的两倍,而且该数组无论如何都需要进一步准备。我是如何在原始字符串中键入的。。。真正的字符串是“*njohnsmithfgeorge#*nHenry*sFord”等等。。。对不起!!我是如何在原始字符串中输入错误的。。。真正的字符串是“*njohnsmithfgeorge#*nHenry*sFord”等等。。。对不起!!