我有标签之间的数据
<ml><locale name="en-US">125LKO.50C-SL137</locale>
<locale name="es-ES"></locale>
</ml>
同样明智的是,我希望像这种格式的数据一样进入数组
arr['en']= "125LKO.50C-SL137"
arr['es']= "-";
或
arr['0']= "125LKO.50C-SL137"
arr['1']= "-";
我正在使用此功能
function get_string_between($string){
$string = preg_replace('/<[^>]*>/', "~", $string);
$words = explode('~', $string);
return array_values(array_filter($words));
}
我如何在php中将数据导入数组,请帮助我。
答案 0 :(得分:1)
$dom = new DOMDocument;
$dom->loadXML($xml);
$xpath = new DOMXpath($dom);
$nodes = $xpath->query('ml/locale');
$result = array();
foreach ($nodes as $node)
{
$result[] = array(
'val' => $node->nodeValue,
'nameAttr' => $node->attributes->getNamedItem('name')->value
);
}
var_dump($result);
尽可能see here,它的效果很好。当然,这段代码根本不是复制粘贴准备好的,但它应该足以让你入门。查看xpath和the DOMDocument
API。这是值得的,保证!
为了更好地帮助你,实际上,在访问返回值的属性之前,首先检查$node->attributes->getNamedItem
的返回值,因为它可以返回null
:
foreach ($nodes as $node)
{
$attribute = $node->attributes->getNamedItem('name') ? : null;
$result[] = array(
'val' => $node->nodeValue,//empty string, or node contents/value
'name' => $attribute ? $attribute->value : null//null, or the name attribute value
);
}
这将是一种更可靠的方法。
答案 1 :(得分:0)
您可以使用可能不是最佳解决方案的正则表达式,但它会像:
<locale.*>(.*)<\/locale>
例如,使用regex101进行测试,它可以正常工作。 像这样使用preg_match_all:
// $string is your DATA to search in
$string = '<ml><locale name="en-US">125LKO.50C-SL137</locale>
<locale name="es-ES"></locale>
</ml>';
preg_match_all("/<locale.*>(.*)<\/locale>/", $string , $matches); // use preg_match only if searching for first occurrence only
foreach($matches[0] as $match){
echo $match; // first one is en and second is es
}
别忘了:使用正则表达式解析xml / html通常不是一个好主意。尝试使用专用的解析器。
答案 2 :(得分:0)
在PHP中,您可以这样做:
$rule = '/\<locale name\=\"([\w\.\-\_]*)\"\>([\w\.\-\_]*)\<\/locale\>/';
然后你这样做:
$array = array();
preg_match_all($ruke, $string, $array);
答案 3 :(得分:0)
您可以使用PHP: XmlReader来读取Xml文件的元素。一个正则表达式是可以的,你可以用它接收你想要的东西,但如果你想要更灵活,我更喜欢PHP Xml Reader类
答案 4 :(得分:0)
您可以尝试以下PHP代码,
<?php
$mystring = <<< 'EOT'
<ml><locale name="en-US">125LKO.50C-SL137</locale>
<locale name="es-ES"></locale>
</ml>
EOT;
$regex = '~(?m)<ml><locale\s*name="..\K-|(?<=>).+?(?=<)~';
preg_match_all($regex, $mystring, $matches);
var_dump($matches);
?>
输出:
array(1) {
[0]=>
array(2) {
[0]=>
string(1) "-"
[1]=>
string(16) "125LKO.50C-SL137"
}
}