匹配下一个正则表达式模式后另一个模式

时间:2014-04-08 21:02:01

标签: php html xml regex svg

我想在每'/</\g>/'之后匹配'/<g>/'的下一次出现。

我尝试在PHP preg_replace中使用此功能删除任何没有ID的组标记<g>。我无法选择每个结束组标记,因为我没有删除所有组标记。

例如:

<g id="someid">
  <g>
    <!--content-->
  </g>
</g>

在上面的示例中,需要保留开放组标记,关闭开始标记的最后一个</g>也是如此。中间的组标签(打开和关闭)需要去,但不是内部的内容。

2 个答案:

答案 0 :(得分:2)

最好使用DOM解析器进行此删除:

$xml = '<g id="someID">
  <g>
    <path d="..." />
  </g>
</g>';
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadXML($xml); // loads your xml
$xpath = new DOMXPath($doc);
$nlist = $xpath->query("//g[not(@id)]"); // g tag without @id

$numnodes = $nlist->length;
for($i=0; $i < $numnodes; $i++) {
   $node = $nlist->item($i);
   $node->parentNode->removeChild($node);
}

$newXML =  $doc->saveXML();
echo $newXML;

输出:

<g id="someID">
</g>

答案 1 :(得分:0)

最好使用HTML解析器而不是正则表达式来执行此类操作。您是否有充分理由使用preg_replace?