【问题标题】:match next regex pattern after another pattern在另一个模式之后匹配下一个正则表达式模式
【发布时间】:2014-05-21 19:15:13
【问题描述】:

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

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

例如:

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

在上面的示例中,需要保留开始组标记,最后一个 &lt;/g&gt; 也将关闭开始标记。中间的组标签(打开和关闭)需要去,而不是里面的内容。

【问题讨论】:

标签: php html xml regex svg


【解决方案1】:

最好使用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>

【讨论】:

  • 谢谢,我知道现在这可能是一个更好的方法。但是,在我有时间使用这种方法重新编写我的 SVG 优化器之前,我还是想把这最后一块拼图放在使用 preg_replace 上。
  • 如果你有 PHP 代码,你可以很好地使用这个 sn-p(不知道什么是 SVG 优化器)
  • 试过这个方法,它删除了要保留的组标签内的内容。它还添加了 html 和 body 标签。代码是 XML(SVG 文件的一部分),所以这不好。
  • 您发布的 XML 示例的预期输出是什么?
【解决方案2】:

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

【讨论】:

  • 到目前为止,它都是我完全使用 preg_replace 构建的 SVG 优化器的一部分。
  • @mike,这应该是评论,而不是答案!
  • @Coop:是的,我们知道,因为对于每个正则表达式模式,您都需要就 SO 提出问题。对于所有 3 个问题(删除 cmets、减少颜色代码、删除没有 id 的标签),使用 DOMDocument 和 XPath 会更好、更简单。
  • @CasimiretHippolyte 希望之前有人提到过!
  • @Coop:人们会回答你提出的问题。您必须了解 regex 可以处理 XML 或 HMTL,但在一般情况下,它并不是最简单的工具。特别是当您需要进行多项更改时。
猜你喜欢
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多