@ Павел Минаев прав, оставив опцию регулярного выражения в качестве крайней меры, и для xml всегда используйте анализатор Xml, теперь вы можете найти анализатор xml почти на всех языках. например Я обычно использую DOMDocument для разбора или создания XML в php. Это действительно просто и легко понять специально для таких людей, как я, которые время от времени используют php.
например, вы хотите извлечь CDATA из следующего xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE message SYSTEM "https://www.abcd.com/dtds/AbcdefMessageXmlApi.dtd">
<message id="9002">
<report>
<![CDATA[id:50121515075540159 sub:001 text text text text text]]>
</report>
<number>353874181931</number>
</message>
Используйте следующий код для извлечения CDATA
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
if (TRUE != $doc->loadXML($xml_response)) {
// log error and / or throw expection or whatever
}
$response_element = $doc->documentElement;
if($response_element->tagName == "message"){
$report_node = $response_element->getElementsByTagName("report");
if($report_node != null && $report_node->length == 1) {
$narrative = $report_node->item(0)->textContent;
$log->debug("CDATA: $narrative");
} else {
$log->error("unable to find report tag or multiple report tag found in response xml");
}
} else {
$log->error("unexpected root tag (" . $response_element->tagName .") in response xml");
}
после выполнения этой переменной $narrative
должен содержаться весь текст, и не беспокойтесь, он не будет содержать некрасивую часть тега CDATA.
Удачного кодирования:)