如何从带有正则表达式的xml中删除几行标签及其内容

时间:2018-06-09 10:49:15

标签: php regex xml

如何使用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>

2 个答案:

答案 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块之间的其他内容非常重要。