#php #xml #regex
#php #xml #регулярное выражение
Вопрос:
У меня есть строка с XML-подобными данными:
<header>Article header</header>
<description>This article is about you</description>
<text>some <b>html</b> text</text>
Мне нужно разобрать его на переменные / объект / массив «заголовок», «описание», «текст».
Каков наилучший способ сделать это? Я пытался $vars = simplexml_load_string($content)
, но это не работает, потому что это не 100% чистый xml (нет <?xml...
).
Итак, я должен использовать preg_match
? Это единственный способ?
Комментарии:
1. Это не xml. Так
simplexml
не работает.
Ответ №1:
Ваша строка XML выглядит как (хотя может быть или не быть) фрагмент XML-документа. PHP может работать с этим с помощью DOMDocumentFragment
класса.
$doc = new DOMDocument;
$frag = $doc->createDocumentFragment();
$frag->appendXML($content);
$parsed = array();
foreach ($frag->childNodes as $element) {
if ($element->nodeType === XML_ELEMENT_NODE) {
$parsed[$element->nodeName] = $element->textContent;
}
}
echo $parsed['description']; // This article is about you
Ответ №2:
С такой строкой simlexml_load_string должен работать.
Из-за 3-го тега, если вы попытаетесь получить это, он завершится неудачей и не вернет правильное значение (потому что в теге есть вспомогательная часть.
Попробуйте что-то подобное, что может сработать для вас:
$xml = simplexml_load_string($content)
$text = $xml->text->asXML();
Вы также должны взглянуть на эту документацию: http://www.php.net/manual/en/simplexmlelement.asxml.php . Они также делают то же самое со строкой. Возможно, вы захотите использовать эту опцию вместо simplexml_load_string
too
$xml = new SimpleXMLElement($string);
Комментарии:
1.
simplexml_load_string
выдает ошибку, когда отсутствует<?xml >
элемент верхнего уровня или.SimpleXMLElement
может быть, так и нужно поступить.