如何在数组中的标记之间获取数据

时间:2014-07-28 11:07:29

标签: php xml regex preg-replace

我有标签之间的数据

<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中将数据导入数组,请帮助我。

5 个答案:

答案 0 :(得分:1)

好吧,我会咬人的。使用正则表达式解析XML就像试图用锤子砍伐树。当然,你可能最终得到的东西看起来很有效,但你会花太多时间编写代码来处理那些你使用的模式并没有完全削减它的情况。
最好解析标记语言,如XML或HTML。幸运的是,PHP附带了几个工具:解析标记。刚刚开始,这就是我处理你拥有的数据的方式:

$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"
  }
}