Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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
Php 使用正则表达式将键值字符串提取到数组中_Php_Regex - Fatal编程技术网

Php 使用正则表达式将键值字符串提取到数组中

Php 使用正则表达式将键值字符串提取到数组中,php,regex,Php,Regex,我有一个元素数组,看起来像: $lang = array( [0] => lang.language = "Language"; [1] => lang.update = "Update"; [2] => lang.lblbasket = "Basket"; ); 我试图将其转换为: $lang = array( [language] => Language, [update] => Update, [lblbask

我有一个元素数组,看起来像:

$lang = array(
    [0] => lang.language = "Language";
    [1] => lang.update = "Update";
    [2] => lang.lblbasket = "Basket";
);
我试图将其转换为:

$lang = array(
    [language] => Language,
    [update] => Update,
    [lblbasket] => Basket
);
我已经设法做到了这一点,但我希望有一个更好的方式来做它,我知道我可以通过regexp实现它,但不太确定如何做到这一点

我就是这样做到的

for($i=0; $i<count($dumpArray); $i++) {
    if (substr($dumpArray[$i], 0, 5 ) == 'lang.') {
        list($lang_label, $lang_value) = explode('=', $dumpArray[$i]);
        $language[substr(trim($lang_label), 5)] = trim(str_replace('"', '', $lang_value));
    }
}

for($i=0;$i如果使用捕获组,正则表达式解决方案将相当简单:

$lang = [];
$regex = '/^lang\.(\S+)\s*=\s*"([^"]*)";$/';
foreach ($dumparray as $str) {
    if (preg_match($regex, $str, $match) === 1) {
        $lang[match[1]] = match[2];
    }
}

Regex解释如下:

您可以从以下位置更改行:

$language[substr(trim($lang_label), 5)] = trim(str_replace('"', '', $lang_value));
为此:

$lang_value = trim(str_replace('"', '', $lang_value);    
$language[trim($lang_label)] = substr($lang_value, 0, strlen($lang_value)-1);


只需使用explode并构建一个新阵列

$lang = array(
    'lang.language' => "Language",
     'lang.update' => "Update",
     'lang.lblbasket' => "Basket",
);

foreach ($lang as $key =>$language)
{
    $split_lang = explode('.',$key);
        $final[$split_lang[1]] = $language ;
}
echo '<pre>';
print_r($final);

这是perl吗?请添加语言标签。这是一个多维数组吗?你确定,这是php吗?我正在了解你的arraydownvote的语法??这是一个证明,这一页被一个松散的佳能访问过,我保证有人曾否决过两个答案,问题是一个人而不是多个人,大小写结束了!伟大的思想都是一样的!你放弃了不过有两个
$
!还值得一提的是,PHP内置了非常易于使用的i18n:感谢Miken32,您的解决方案非常有效。我可以预见的唯一问题是等号(字符串内)前后可能没有任何空格(在原始语言文件中)。除此之外,它工作得很好。感谢againI,我正在尝试使用正则表达式来提供更优雅、更快的解决方案。必须使用一个正则表达式而不是几个核心函数来解决问题似乎更可行、更实用、更快的解决方案DownVote??这证明本页被一个松散的canon访问过,我保证,有谁访问过两个答案,问题是一人而不是多人,案件结案!
$language[substr(trim($lang_label), 5)] = trim(str_replace(array('"', ';'), '', $lang_value));
$lang = array(
    'lang.language' => "Language",
     'lang.update' => "Update",
     'lang.lblbasket' => "Basket",
);

foreach ($lang as $key =>$language)
{
    $split_lang = explode('.',$key);
        $final[$split_lang[1]] = $language ;
}
echo '<pre>';
print_r($final);
Array
(
    [language] => Language

    [update] => Update

    [lblbasket] => Basket
)