用于替换XML标记的正则表达式

时间:2012-09-20 06:49:55

标签: php xml regex parsing

我正在尝试从xml替换标记。我已经通过curl在变量中存储了一个xml结果。并尝试制作file.xml。 当它

  <Topics>
  <Topic code="Balances" count="26" pagesize="100" />
  </Topics>

使用此功能,它不会返回任何匹配项。为什么呢?

 function get_tag( $tag, $xml ) {
    $tag = preg_quote($tag);

     preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>}',
               $xml,
               $matches,
               PREG_PATTERN_ORDER);

  return $matches[1];
 }

2 个答案:

答案 0 :(得分:3)

您的示例是解析文档的非常糟糕和缓慢的实现。建议您应该查看DOMDocument对象并尝试实现它。

根据您的示例的基本用法:

$dom = new DOMDocument();
$dom->loadXML("<xml ... />"); // Current document

$replace = $dom->getElementsByTagName($tag);

foreach ($replace as $node)
{
    $xml = $dom->createDocumentFragment();
    $xml->loadXML("<xml ... />"); // XML to replace original with

    $dom->replaceChild($xml, $node); // XML is your new node
}

$dom->normalize(); // Saves the changes
echo $dom->saveXML(); // Output

编辑;对不起 - 现在更好的例子。

答案 1 :(得分:0)

这是你想要的:

<?php

$xml = '
<tag1>
    <tag2>
        x
    </tag2>
    <tag3>
    </tag3>
    <tag2>
        y
    </tag2>
</tag1>
';

function get_tag($tag, $xml){
    $tag = preg_quote($tag);

    preg_match_all('/<'.$tag.'.*?>(.*?)<\/'.$tag.'>/s', $xml, $matches, PREG_PATTERN_ORDER);

    return $matches[1];
}

print_r(get_tag('tag2', $xml));

?>

输出:

Array
(
    [0] => 
        x

    [1] => 
        y

)