Проблема с использованием атрибутов DOMNode-> с атрибутами, состоящими из нескольких слов в значении - PullRequest
2 голосов
/ 13 апреля 2011

Я почесал голову над этим слишком долго ...

$dom = new DOMDocument();
$dom->loadHTML( $content );

$links = $dom->getElementsByTagName( 'a' )->item( 0 );
foreach ( $links->attributes as $attribute ) {
    $name = $attribute->nodeName;
    $value = str_replace( '"', '', stripslashes( $attribute->nodeValue ) );
    echo "$name: $value<br />";
}

Вот мой код, который я в итоге получил: php dom получает все атрибуты узла .Я также пробовал другие методы, такие как вызов getAttribute () для одного атрибута, чтобы посмотреть, сработает ли он, но получил тот же результат.

HTML-код, который я пытаюсь пройти, просто:

<a id="testid" title="testtitle" name="this is a testname" href="http://example.com/">link!</a>

Я получаю следующую ошибку:

Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: error parsing attribute name in Entity, line: 1

Мой скрипт выводит:

id: testid
title: testtitle
name: this
is: 
a: 
testname: 
href: http://example.com/

Я должен добавить, что вывод работает нормально, если 'name'атрибут - это одно слово.

Очевидно, что он должен использовать explode () или что-то глупое в пробелах.Есть ли способ обойти это без преобразования всех пробелов в% 20 или что-то еще (у меня есть много другого контента помимо ссылок, и я не хотел бы конвертировать целый блок контента)?

1 Ответ

4 голосов
/ 13 апреля 2011

Как отмечено в комментариях, атрибут name разделяет то же пространство, что и атрибут id, который определяется как "токен NAME" , который ограничен буквами, цифрами, тире, подчеркивания, точки и двоеточия.

Вы заметите, что в этом списке нельзя использовать пробелы.

Некоторые версии синтаксического анализатора DOMDocument, которые использует PHP, очень строги относительно соответствия HTML,будет скулить и регулярно делать неправильных вещей, когда сталкивается с нарушениями спецификации.Это может быть одним из таких случаев.Удалите пробелы из вашего атрибута имени и посмотрите, продолжаете ли вы видеть проблему.

...