У меня проблема с фрагментом XML, который я хочу проанализировать с помощью PHP.
Вот пример, который я имею:
<tags>
<content>content</content>
<amplifications>
<tag>content 1</tag>
</amplifications>
<amplifications>
<tag>content 2</tag>
<tag>content 3</tag>
<tag>content 4</tag>
<tag>content 5</tag>
</amplifications>
</tags>
Где я хочу убрать
</amplifications>
<amplifications>
Я пытался использовать preg_replace, но кажется, что я не могу понять это, потому что эти теги имеют отступы по-разному и есть пробелы.
Это должно помочь вам.
str_replace("</", "<", $XMLData);
Первая проблема, с которой вы можете столкнуться — preg_replace
не совпадает между разными строками по умолчанию.
Вы можете добавить модификатор (http://php.net/manual/en/reference.pcre.pattern.modifiers.php) чтобы изменить это.
м (PCRE_MULTILINE)
По умолчанию PCRE рассматривает строку темы как состоящую из одной «строки» символов (даже если она на самом деле содержит несколько новых строк). Метасимвол «начало строки» (^) совпадает только в начале строки, а метасимвол «конец строки» ($) — только в конце строки или перед завершающим символом новой строки (если не установлен модификатор D ). Это так же, как Perl. Когда этот модификатор установлен, конструкции «начало строки» и «конец строки» совпадают сразу после или непосредственно перед любой новой строкой в строке темы соответственно, а также в самом начале и конце. Это эквивалентно модификатору Perl’s / m. Если в строке темы нет символов «\ n» или в шаблоне нет вхождений ^ или $, установка этого модификатора не имеет никакого эффекта.
После этого вы должны быть осторожны при написании регулярного выражения. Такие вещи могут произойти:
<amplifications>
<amplifications>
</amplifications>
</amplifications>
И ты не хочешь соответствовать первому <amplifications>
с первым </amplifications>
, Если этот случай не может произойти, ваше регулярное выражение будет легче написать.
Я могу добавить детали, если вы хотите, но это уже должно вам немного помочь.
Объедините все дочерние элементы всех элементов с определенным именем тега в первый элемент:
Пример XML:
<tags>
<content>content</content>
<amplifications>
<tag>content 1</tag>
</amplifications>
<amplifications>
<tag>content 2</tag>
<tag>content 3</tag>
<tag>content 4</tag>
<tag>content 5</tag>
</amplifications>
</tags>
РНР-Пример:
$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->preserveWhiteSpace = false;
$doc->loadXML($xml);
$name = 'amplifications';
$elements = $doc->getElementsByTagName($name);
foreach ($elements as $parent) {
if ($elements->item(0) === $parent) {
continue;
}
foreach (iterator_to_array($parent->childNodes) as $child) {
$elements->item(0)->appendChild($child);
}
$parent->parentNode->removeChild($parent);
}
echo $doc->saveXML();
Выход:
<?xml version="1.0"?>
<tags>
<content>content</content>
<amplifications>
<tag>content 1</tag>
<tag>content 2</tag>
<tag>content 3</tag>
<tag>content 4</tag>
<tag>content 5</tag>
</amplifications>
</tags>