У меня проблема с фрагментом 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, но кажется, что я не могу понять это, потому что те теги имеют отступы по-разному и есть пробелы.
Объедините всех дочерних элементов всех элементов с определенным именем тега в первый элемент:
Пример 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>
Первой проблемой, с которой вы можете столкнуться, является то, что preg_replace
по умолчанию не совпадает между разными строками.
Вы можете добавить модификатор (http://php.net/manual/en/reference.pcre.pattern.modifiers.php), чтобы изменить это.
м (PCRE_MULTILINE)
По умолчанию PCRE обрабатывает строку subject как состоящую из одной "строки" символов (даже если она фактически содержит несколько строк новой строки). Метахарактер "начала строки" (^) соответствует только в начале строки, в то время как метасимвол "конец строки" ($) соответствует только в конце строки или перед завершающей новой строкой (если не установлен D-модификатор). Это то же самое, что и Perl. Когда этот модификатор установлен, конструкции "начало строки" и "конец строки" соответствуют сразу после или непосредственно перед любой новой строкой в строке темы, соответственно, а также в самом начале и в конце. Это эквивалентно модификатору Perl/m. Если в строке субъекта нет символов "\n", или нет вхождений ^ или $ в шаблоне, установка этого модификатора не влияет.
После этого вы должны быть осторожны при написании своего регулярного выражения. Такие вещи могут произойти:
<amplifications>
<amplifications>
</amplifications>
</amplifications>
И вы не хотите сопоставлять первые <amplifications>
с первым </amplifications>
. Если этого не произойдет, ваше регулярное выражение будет легче писать.
Я могу добавить детали, если вы захотите, но это уже должно помочь вам немного.
Это должно помочь вам.
str_replace("</", "<", $XMLData);