Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
preg_split如何使用php将分隔符转换为索引_Php_Regex_Preg Split - Fatal编程技术网

preg_split如何使用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] =>

我在PHP中使用了以下字符串:
*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”等等。。。对不起!!