php-DOM, не можу победить, и мануал не помогает.
Написал кусочек кода:
[HTML]<?php
$pac_url = 'http://domen.ru/and_td_and_tp.htm';
$doc = new DOMDocument();
@$doc->loadHTMLFile($pac_url);
$tags = $doc->getElementsByTagName('a');
$file = fopen("pac_links.txt","a");
foreach ($tags as $tag) {
fputs($file, $tag->getAttribute('href'));
}
fclose($file);
?>[/HTML]
Всё работает.
У хостера последняя стабильная версия пхп4. Выкладываю хостеру - не работает. Читаю мануал, исправляю:
[HTML]<?php
$pac_url = 'http://domen.ru/and_td_and_tp.htm';
$pac_html = file_get_contents($pac_url);
@$doc = new DOMDocument($pac_html);
@$tags = $doc->get_elements_by_tagname('a');
$file = fopen("pac_links.txt","a");
foreach ($tags as $tag) {
fputs($file, $tag->get_attribute('href'));
}
fclose($file);
?>[/HTML]
не работает.
Контент, загруженный в $pac_html весьма паршивого содержания, много JavaScript-овых включений и линки километровые. В DOM/php5 спасает собака, a php4 вначале ругался на третью строку - засобачил... стал ругаться на четвертую - засобачил, теперь ругается на атрибут foreach.
Наверное я не так пишу...:)
Да, если загружаю ровную страницу с хорошим чистым html, то всё работает и у хостера. Во как!
Есть у кого идеи?
В мануале написано:
The DOM extension allows you to operate on XML documents through the DOM API with PHP 5.
For PHP 4, use DOM XML.
А что странно то? Эти функции как раз For PHP 4/DOM XML.
Так ведь работает:
[HTML]<?php
$myhtml = <<<EOF
<html>
<head>
<title>My Page</title>
</head>
<body>
<p><a href="/mypage1">Hello World!</a></p>
<p><a href="/mypage2">Another Hello World!</a></p>
</body>
</html>
EOF;
$doc = new DOMDocument($myhtml);
$tags = $doc->get_elements_by_tagname('a');
$file = fopen('links/poc_links.txt','a');
foreach ($tags as $tag) {
$temp = $tag->get_attribute('href');
@fwrite($file, $temp);
}
fclose($file);
?>[/HTML]
PS 4 PHP доживает вообще последнии 2 месяца, так что подумай.
не работает.
И не должно работать.
Для работы с DOM на PHP нужно понимать ряд вещей:
1) DOM в ветках 4 и 5 разные. В 4 это DOM XML Functions в 5 ветке DOM Functions. Это разные интерфейсы, и свойства/методы в кажом свои.
2) Ветка 4 умирает, я лично DOM из 4 ветки не использую с момента выхода 5-ой версии. Хостеров у которых стоит 4 версия нужно бросать и бежать от них без глядки. DOM из 4-ой ветке не соответсвует DOM API от W3C, а 5-ой соответсвует. Если ты будешь знать DOM API стандартный, то смодешь его применять не только в PHP (в любом языке, например в JavaScript).
3) Хотя бы указал, в какой строке у тебя ошибка. Не работает тут не катит.
4) В PHP 5 zend.ze1_compatibility_mode ставим в off.
Вот, вот, меня, как shaelf отправил мануал бороздить:) , занесло на DOM ветку, и я жутко обрадовался (раньше не знал) наличию в php5 полноценных DOM-функций. Со стандартным DOM почти всё понятно, но я не могу управлять планами хостера, а сбежать, так просто не сбежишь, уже проплачено. Мне и MySQL приходится старую на локале держать. Но вроде потихоньку хостер начинает исправляться, только не стого начинает, cPanel обновил :D.
За zend.ze1_compatibility_mode спасибо, на локале пригодится.
Ну, прежде всего, ошибка с контентом:) В первом примере для php5 при загрузке контента вылетает:
Видимо, контент написан без особого пристрастия к рекомендациям...
Но php5 это дело второе, сейчас нужно заточить скрипт под php4. Хочется достать ссылки из контента именно через get_elements_by_tagname, а загрузить корявый документ в созданный DOMDocument не получается, от сюда все проблемы.
Я упростил код:
[HTML]$poc_html = file_get_contents($cont);
echo $poc_html;
@$doc = new DOMDocument($poc_html);
echo $doc;[/HTML]
Влетает такая ошибка:
Хотя, эта ошибка то же не понятна, контент загружается через ile_get_contents, и это уже строка! а в линии 6 стоит сейчас echo $doc;
Или при создании DOMDocument происходит раскладка на строки?
В принцыпе, мне нужны только доменные имена, но я не смог написать правельную регулярку... целую ночь пытался написать, весь инет переколпатил, уму маловато :confused: Может кто подарит шаблон? rolleyes:
Вот так...
В начале скрипта прописываю
[HTML]ini_set('zend.ze1_compatibility_mode',0);[/HTML]
не помогает, пишет подобные ошибки:
Влетает такая ошибка:
А чего не понятного? Написано вполне разборчиво, "не могу конвертировать DOMDocument в строку", ты же через echo вызываешь приведение DOMDocument к строке, а у тебя интерпретатор этого не может сделать. О чем и сообщает.
Или при создании DOMDocument происходит раскладка на строки?
При построении DOM идет распарсивание страницы на структуры в ОЗУ сервера.
В принцыпе, мне нужны только доменные имена,
Тем более для твое задачи DOM это из пушки по воробъям. DOM будет работать в 10 раз медлее регулрки, не говоря уже про количество потребляемой ОЗУ.
И потом "доменное имя" растяжимое понятие. Доменное имя где? В адресе ссылок на странице?
Вот ещё какая шняга, на локале, под php5,
XXXI. DOM XML Functions
DOM XML работают в 4-ой версии. zend.ze1_compatibility_mode не включает поддежку работы со старыми функциями. Это просто режим совместимости, для DOM он в принципе выключает вообще не стандартный DOM из работы.
Вообще то на сколько я знаю народ умудрялся на 5-ой версии подрубать DOM XML и на 4 версии умудрялись запускать DOM, но это изврат чистой воды не говоря уже про то, что на это убили кучу времени, да и root-а нужно иметь для такого вида манимуляций.
Если бы в адресной ссылке!!! Таких шаблонов много.... А в этом контенте ссылки есть в разном виде. Вот примеры:
fgh/09-00=http://dive.com/doc/extrim.htm?err-fhg...
GFjh_TYwww.com-to.com/baner/gig.php&kgkgkg
А есть вообще типа uyguyTYgeneral.ruYUmgmgm
Ну это я сам сочинил, но так и есть. Единственное, передссылкой всегда однозначно определенные символы типа TYgeneral.ru, но перед www или http может и не быть TY.
Главное, у меня почему то не получилось искать по всему файлу, вроде и переводов строк нет, а находит только первую ссылку.
Нужно было перед выполнением preg_match_all() выполнить addslashes(). Теперь находит все вхождения....
Решил отказаться от DOM полностью, alekciy напугал скоростью..:)
Решил отказаться от DOM полностью, alekciy напугал скоростью..:)
Я догадывался что регулярка быстрее, DOM и в JavaScript тормозит прилично, особенно заметно в циклах.