2016-06-16 3 views
0

Я пытаюсь взять контент <svg> из HTML и поместить его в массив для последующего использования. Мой код ...getElementsByTagName не обнаруживает SVG - PHP

$html_content = ' 
<div class="stage" id="shape_1"><svg height="100" version="1.1" width="350" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: relative; left: -0.316681px; top: -0.650024px;"><desc>Created with Raphaël 2.1.2</desc><defs/><rect x="75" y="25" width="200" height="50" r="0" rx="0" ry="0" fill="#90ee90" stroke="#000" style="fill-opacity: 0.5;" fill-opacity="0.5" stroke-width="0"/><path style="stroke-opacity: 0.8;" fill="none" stroke="#666666" d="M75,25L275,25" stroke-width="2" stroke-opacity="0.8"/><path style="stroke-opacity: 0.8;" fill="none" stroke="#666666" d="M275,25L275,75" stroke-width="2" stroke-opacity="0.8"/><path style="stroke-opacity: 0.8;" fill="none" stroke="#666666" d="M275,75L75,75" stroke-width="2" stroke-opacity="0.8"/><path style="stroke-opacity: 0.8;" fill="none" stroke="#666666" d="M75,75L75,25" stroke-width="2" stroke-opacity="0.8"/><text style="text-anchor: middle; font: 15px Arial;" x="175" y="85" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" transform="matrix(1,0,0,1,0,6.5)" font-family="Arial" font-size="15px" font-style="normal" font-weight="normal"><tspan dy="5">x + 10 ft.</tspan></text><text style="text-anchor: end; font: 15px Arial;" x="65" y="50" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" font-family="Arial" font-size="15px" font-style="normal" font-weight="normal"><tspan dy="5">x ft.</tspan></text></svg></div>'; 

$doc = new DOMDocument(); 
$doc->loadHTML($html_content); 

$svg = $doc->getElementsByTagName('svg'); 
foreach ($svg as $svg_item) { 
    array_push($svg_array, $svg_item); 
} 

print_r($svg_array); 

Проблема заключается в том, что $svg_array пуста. Я знаю, что есть <svg> контент в $html_content.

BTW, я получаю несколько предупреждений на странице в целом (поскольку я выполняю приведенный выше код в цикле). Они, как ...

"Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: Неожиданный конечный тег: DIV в Entity, строка: 46 в ..."

или

"Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: Метка с недействительным в Сущности, строка: 119 в ..."


Edit: при более глубоком исследовании, урезанная версия мой код выдает следующие предупреждения ...

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: Tag SVG недействителен в Сущности, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml] : Тег desc недействителен в Entity, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: тег defs недействителен в Entity, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: Tag прямоугольник недействительным в Сущности, строка: 2 в .....

Предупреждение: DOMDoc ument :: loadHTML() [domdocument.loadhtml]: Недопустимый путь тега в Entity, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: путь тега недействителен в Entity , линия: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: путь Тэг недействительным в Сущности, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: путь тега недействителен в Entity, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: текст тега недействителен в Entity, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: Tag tspan недействительным в Entity, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml] : Текст тега недействителен в объекте, строка: 2 в .....

Предупреждение: DOMDocument :: loadHTML() [domdocument.loadhtml]: тег tspan недействителен в Entity, строка: 2 в .....

Возможно, <svg> не поддерживается ????


Мысли?

+0

Да, вы должны как минимум добавить код к вопросу (или вырезать копию, которая показывает ту же проблему). Это действительно звучит очень ужасно, как html искажен. Хотя вы знаете, что $ htmlContent содержит что-то, откуда вы знаете, что он даже загружен должным образом и передает его объекту $ doc? – enhzflep

+0

@enhzflep: Я выводил его, и надлежащее содержимое отображалось надлежащим образом. – gtilflm

+0

Вы были здесь достаточно долго, чтобы знать, чем всегда рекомендуется MCVE. Если вы решите не предоставлять один, не удивляйтесь, если читатели предпочитают не отвечать на ваш вопрос. : shrugs: http://stackoverflow.com/help/mcve – enhzflep

ответ

0

Теперь вопрос можно более легко раздирать, когда оскорбительная строка html включена и может быть дополнительно исследована путем распространения входного текста на несколько строк. Когда это делается, мы получим строку ввода, расположенную на 17 строк. Затем мы можем использовать предупреждающие сообщения и номера строк, чтобы быстро идентифицировать части ввода, которые причиняют вред синтаксическому анализатору.

'<div class="stage" id="shape_1"> 
    <svg height="100" version="1.1" width="350" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: relative; left: -0.316681px; top: -0.650024px;"> 
    <desc>Created with Raphaël 2.1.2</desc> 
    <defs/> 
    <rect x="75" y="25" width="200" height="50" r="0" rx="0" ry="0" fill="#90ee90" stroke="#000" style="fill-opacity: 0.5;" fill-opacity="0.5" stroke-width="0"/> 
    <path style="stroke-opacity: 0.8;" fill="none" stroke="#666666" d="M75,25L275,25" stroke-width="2" stroke-opacity="0.8"/> 
    <path style="stroke-opacity: 0.8;" fill="none" stroke="#666666" d="M275,25L275,75" stroke-width="2" stroke-opacity="0.8"/> 
    <path style="stroke-opacity: 0.8;" fill="none" stroke="#666666" d="M275,75L75,75" stroke-width="2" stroke-opacity="0.8"/> 
    <path style="stroke-opacity: 0.8;" fill="none" stroke="#666666" d="M75,75L75,25" stroke-width="2" stroke-opacity="0.8"/> 
    <text style="text-anchor: middle; font: 15px Arial;" x="175" y="85" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" transform="matrix(1,0,0,1,0,6.5)" font-family="Arial" font-size="15px" font-style="normal" font-weight="normal"> 
     <tspan dy="5">x + 10 ft.</tspan> 
    </text> 
    <text style="text-anchor: end; font: 15px Arial;" x="65" y="50" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" font-family="Arial" font-size="15px" font-style="normal" font-weight="normal"> 
    <tspan dy="5">x ft.</tspan> 
    </text> 
    </svg> 
</div>'; 

Теперь, если мы остановиться и подумать об этом на секунду, SVG на самом деле это не HTML - это диалект XML тоже. Тот же родитель, но все же не один и тот же, мы внедряем XML внутри HTML из-за отсутствия лучшей терминологии, когда мы используем SVG таким образом, который у вас есть. Имея это в виду, вряд ли кажется удивительным, что 17 входных строк приводят к появлению следующих предупреждающих сообщений. Указанные объекты действительно не являются стандартными HTML-тегами. (Тег 5-слово каждой строки - .SVG, DESC, DEFS, и т.д., и т.д.)

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 2 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag desc invalid in Entity, line: 3 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag defs invalid in Entity, line: 4 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag rect invalid in Entity, line: 5 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 6 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 7 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 8 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 9 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag text invalid in Entity, line: 10 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag tspan invalid in Entity, line: 11 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag text invalid in Entity, line: 13 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Warning: DOMDocument::loadHTML(): Tag tspan invalid in Entity, line: 14 in C:\xampp2\htdocs\*redacted*\svg.php on line 23 

Итак, что делать? Просто. Вместо того, чтобы пытаться загрузить XML с помощью метода loadHTML, просто используйте вместо этого метод loadXML. После этого выход будет следующим:

Array ([0] => DOMElement Object ([tagName] => svg [schemaTypeInfo] => [nodeName] => svg [nodeValue] => Created with Raphaël 2.1.2 x + 10 ft. x ft. [nodeType] => 1 [parentNode] => (object value omitted) [childNodes] => (object value omitted) [firstChild] => (object value omitted) [lastChild] => (object value omitted) [previousSibling] => (object value omitted) [nextSibling] => (object value omitted) [attributes] => (object value omitted) [ownerDocument] => (object value omitted) [namespaceURI] => http://www.w3.org/2000/svg [prefix] => [localName] => svg [baseURI] => file:/C:/xampp2/htdocs/*redacted*/ [textContent] => Created with Raphaël 2.1.2 x + 10 ft. x ft.)) 
+0

html [включает SVG] (https://www.w3.org/TR/html5/embedded-content-0.html#svg), так что это действительно ** ** html в эти дни –

0

Хм, может быть, PHP не поддерживает это?

Следующий пример получает через JavaScripts SVG getElementsByTagName:

var e = document.getElementsByTagName('svg'); 
 
console.log(e[0]);
<svg viewBox="0 0 100 100"> 
 
</svg>

0

Эта функция делает не очень хорошо с элементами HTML5, таких как SVG. Большинство рекомендаций в Интернете - отключить ошибки, чтобы работать с HTML5.

+1

Действительно. Хотя HTML5 позволяет определять свои собственные элементы/сущности, метод loadHTML несколько бесполезен, если вы определили свои собственные теги. В случае встроенного SVG это не HTML, а скорее XML и, как таковой, содержит теги, которые не распознаются парсером HTML, - ситуация, отличная от ситуации, возникающей при попытке проанализировать HTML5-код, содержащий пользовательские элементы. Спина вниз. – enhzflep