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