如何使用regex和php从xml中删除几行标签及其内容?
我试过了:
$content = preg_replace('/<\JournalIssue CitedMedium="Print">.*?<\/JournalIssue>/i', '', $content);
要移除的xml:
<JournalIssue CitedMedium="Print">
<Volume>38</Volume>
<Issue>1-2</Issue>
<PubDate>
<MedlineDate>2017 Jan-Jun</MedlineDate>
</PubDate>
</JournalIssue>
答案 0 :(得分:1)
虽然对于特定情况一般可能,但使用RegEx来操作XML是个坏主意。使用RegEx,您可以将XML视为简单文本。您必须将有关XML的知识放入RegEx。
XML Api可以提供特定功能,例如Xpath支持。
$xml = <<<'XML'
<JournalIssues>
<JournalIssue CitedMedium="Print">
</JournalIssue>
<JournalIssue CitedMedium="Screen">
</JournalIssue>
</JournalIssues>
XML;
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate('//JournalIssue[@CitedMedium="Print"]') as $issueNode) {
$issueNode->parentNode->removeChild($issueNode);
}
echo $document->saveXml();
输出:
<?xml version="1.0"?>
<JournalIssues>
<JournalIssue CitedMedium="Screen">
</JournalIssue>
</JournalIssues>
答案 1 :(得分:0)
您可以在下方使用,但不建议在XML上使用正则表达式。
$content = preg_replace(
'/<JournalIssue CitedMedium="Print">(.*?)JournalIssue>/is',
'',
$content
);
键是修饰符/ s
s(PCRE_DOTALL) 如果设置了此修饰符,则模式中的点元字符将匹配所有字符,包括换行符。没有它,新行就是 排除。此修饰符等效于Perl&#s; s修饰符。一个 负面类如[^ a]总是匹配换行符, 独立于此修饰符的设置。
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
另外(。*?)对于替换多个JournalIssue块之间的其他内容非常重要。