Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在另一个模式之后匹配下一个正则表达式模式_Php_Html_Xml_Regex_Svg - Fatal编程技术网

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

Php 在另一个模式之后匹配下一个正则表达式模式,php,html,xml,regex,svg,Php,Html,Xml,Regex,Svg,我想在每个'/'之后匹配下一次出现的'/' 我试图在PHPpreg\u replace中使用此选项删除任何没有id的组标记。我无法选择每个结束组标记,因为我没有删除所有组标记 例如: <g id="someid"> <g> <!--content--> </g> </g> 在上面的示例中,需要保留期初组标记,最后一个将关闭期初标记的也需要保留。需要删除中间的组标记(打开和关闭),但不需要删除其中的内容。最好使用DO

我想在每个
'/'
之后匹配下一次出现的
'/'

我试图在PHP
preg\u replace
中使用此选项删除任何没有id的组标记
。我无法选择每个结束组标记,因为我没有删除所有组标记

例如:

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


在上面的示例中,需要保留期初组标记,最后一个将关闭期初标记的
也需要保留。需要删除中间的组标记(打开和关闭),但不需要删除其中的内容。

最好使用
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;
$xml='1!'
';
$doc=新的DOMDocument();
libxml\u使用\u内部错误(true);
$doc->loadXML($xml);//加载您的xml
$xpath=新的DOMXPath($doc);
$nlist=$xpath->query(“//g[not(@id)]”);//不带@id的g标记
$numnodes=$nlist->length;
对于($i=0;$i<$numnodes;$i++){
$node=$nlist->item($i);
$node->parentNode->removeChild($node);
}
$newXML=$doc->saveXML();
echo$newXML;
输出:


最好使用HTML解析器而不是正则表达式来执行此类操作。使用preg\u replace有什么好的理由吗?

到目前为止,这都是我完全使用preg\u replace构建的SVG优化器的一部分。@mike,这应该是一个注释,而不是答案@Coop:是的,我们知道,因为对于每个正则表达式模式,你需要问一个问题。对于所有3个问题(删除注释、减少颜色代码、删除没有id的标记),使用DOMDocument和XPath更好、更简单。@CasimiritHippolyte希望有人以前提到过这一点@Coop:人们会回答你提出的问题。您必须了解regex可以处理XML或HMTL,但在一般上下文中,它不是最容易做到这一点的工具。特别是当你有一些改变要做的时候。谢谢,我看这可能是一个更好的方法了。但是,在我有时间使用此方法重新编写SVG优化器之前,我想将最后一块拼图放在使用
preg_replace
中。如果您有PHP代码,您可以很好地使用此代码段(不知道什么是SVG优化器)尝试此方法,并删除了要保留的组标记内的内容。它还添加了html和body标记。代码是XML(SVG文件的一部分),因此这是不好的。发布的XML示例的预期输出是什么?永远不要尝试!
<g id="someID">
</g>