PHP: 使用正则表达式关联数组的数据属性
PHP: data-attributes to associative array using regex
基本上我想把这个充满数据-*属性的字符串变成一个关联数组,其中*是键,值是值。例如
'data-pageid="11" data-start="12" => [pageid=>'11',start=>'12]
所以我得到了这个丑陋的正则表达式代码,看起来像
$pattern = '/data-(\w+)=/';
$string = '<strong class="annotate annotateSelected" data-pageid="1242799" data-start="80" data-end="86" data-canon="Season" data-toggle="tooltip" title="Season (SPORTS_OBJECT_EVENT)" data-placement="top" data-type="SPORTS_OBJECT_EVENT"><em>season</em></strong>';
preg_match_all($pattern,$string,$result);
$arr = array();
foreach($result[1] as $item){
$pat = '/data-'.$item.'="(?P<'.$item.'>\w+?)"/';
preg_match($pat, $string, $res);
$arr[$item] = $res[1];
}
echo print_r($arr);
打印出来
Array
(
[pageid] => 1242799
[start] => 80
[end] => 86
[canon] => Season
[toggle] => tooltip
[placement] => top
[type] => SPORTS_OBJECT_EVENT
)
必须有更好的方法来做到这一点。无论如何要将其提炼成 1 个正则表达式函数,还是我坚持这样做。
您可以使用命名捕获组,然后使用 array_combine()
...
preg_match_all('~data-(?P<name>\w+)="(?P<val>[^"]*)"~', $str, $m);
print_r(array_combine($m['name'], $m['val']));
输出
Array
(
[pageid] => 1242799
[start] => 80
[end] => 86
[canon] => Season
[toggle] => tooltip
[placement] => top
[type] => SPORTS_OBJECT_EVENT
)
基本上我想把这个充满数据-*属性的字符串变成一个关联数组,其中*是键,值是值。例如
'data-pageid="11" data-start="12" => [pageid=>'11',start=>'12]
所以我得到了这个丑陋的正则表达式代码,看起来像
$pattern = '/data-(\w+)=/';
$string = '<strong class="annotate annotateSelected" data-pageid="1242799" data-start="80" data-end="86" data-canon="Season" data-toggle="tooltip" title="Season (SPORTS_OBJECT_EVENT)" data-placement="top" data-type="SPORTS_OBJECT_EVENT"><em>season</em></strong>';
preg_match_all($pattern,$string,$result);
$arr = array();
foreach($result[1] as $item){
$pat = '/data-'.$item.'="(?P<'.$item.'>\w+?)"/';
preg_match($pat, $string, $res);
$arr[$item] = $res[1];
}
echo print_r($arr);
打印出来
Array
(
[pageid] => 1242799
[start] => 80
[end] => 86
[canon] => Season
[toggle] => tooltip
[placement] => top
[type] => SPORTS_OBJECT_EVENT
)
必须有更好的方法来做到这一点。无论如何要将其提炼成 1 个正则表达式函数,还是我坚持这样做。
您可以使用命名捕获组,然后使用 array_combine()
...
preg_match_all('~data-(?P<name>\w+)="(?P<val>[^"]*)"~', $str, $m);
print_r(array_combine($m['name'], $m['val']));
输出
Array
(
[pageid] => 1242799
[start] => 80
[end] => 86
[canon] => Season
[toggle] => tooltip
[placement] => top
[type] => SPORTS_OBJECT_EVENT
)