Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

php-DOM, не можу победить, и мануал не помогает.

1.8K
21 октября 2007 года
Ghirik
260 / / 15.03.2007
На локале стоит пхп5.
Написал кусочек кода:

[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, то всё работает и у хостера. Во как!
Есть у кого идеи?
1.8K
21 октября 2007 года
Ghirik
260 / / 15.03.2007
P.S. Я ни чьи сайты не граблю.... только гигантов...
8
21 октября 2007 года
mfender
3.5K / / 15.06.2005
Странно всё это...
В мануале написано:

Цитата:

The DOM extension allows you to operate on XML documents through the DOM API with PHP 5.

For PHP 4, use DOM XML.

1.8K
21 октября 2007 года
Ghirik
260 / / 15.03.2007
Цитата:
Странно всё это...



А что странно то? Эти функции как раз 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]

15
21 октября 2007 года
shaelf
2.7K / / 04.05.2005
Ты знаешь, собаки совсем не помогают. Если ругается на ошибку, то её не акрывать нужно, а исправлять.
PS 4 PHP доживает вообще последнии 2 месяца, так что подумай.
12
21 октября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik

не работает.


И не должно работать.
Для работы с 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.

1.8K
21 октября 2007 года
Ghirik
260 / / 15.03.2007
Цитата:
DOM API от W3C, а 5-ой соответсвует. Если ты будешь знать DOM API стандартный, то смодешь его применять не только в PHP (в любом языке, например в JavaScript).



Вот, вот, меня, как shaelf отправил мануал бороздить:) , занесло на DOM ветку, и я жутко обрадовался (раньше не знал) наличию в php5 полноценных DOM-функций. Со стандартным DOM почти всё понятно, но я не могу управлять планами хостера, а сбежать, так просто не сбежишь, уже проплачено. Мне и MySQL приходится старую на локале держать. Но вроде потихоньку хостер начинает исправляться, только не стого начинает, cPanel обновил :D.
За zend.ze1_compatibility_mode спасибо, на локале пригодится.

Цитата:
3) Хотя бы указал, в какой строке у тебя ошибка. Не работает тут не катит.



Ну, прежде всего, ошибка с контентом:) В первом примере для php5 при загрузке контента вылетает:

Цитата:
Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: htmlParseEntityRef: expecting ';' in



Видимо, контент написан без особого пристрастия к рекомендациям...

Но 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]

Влетает такая ошибка:

Цитата:
Catchable fatal error: Object of class DOMDocument could not be converted to string in C:\Apache\htdocs\links1.php on line 6



Хотя, эта ошибка то же не понятна, контент загружается через ile_get_contents, и это уже строка! а в линии 6 стоит сейчас echo $doc;
Или при создании DOMDocument происходит раскладка на строки?

В принцыпе, мне нужны только доменные имена, но я не смог написать правельную регулярку... целую ночь пытался написать, весь инет переколпатил, уму маловато :confused: Может кто подарит шаблон? rolleyes:

Вот так...

1.8K
22 октября 2007 года
Ghirik
260 / / 15.03.2007
Вот ещё какая шняга, на локале, под php5, не могу добиться работы этих функций.
В начале скрипта прописываю
[HTML]ini_set('zend.ze1_compatibility_mode',0);[/HTML]
не помогает, пишет подобные ошибки:
Цитата:
Fatal error: Call to undefined method DOMDocument::html_dump_mem() in C:\Apache\htdocs\links1.php on line 6

12
22 октября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik

Влетает такая ошибка:


А чего не понятного? Написано вполне разборчиво, "не могу конвертировать DOMDocument в строку", ты же через echo вызываешь приведение DOMDocument к строке, а у тебя интерпретатор этого не может сделать. О чем и сообщает.

12
22 октября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik

Или при создании DOMDocument происходит раскладка на строки?


При построении DOM идет распарсивание страницы на структуры в ОЗУ сервера.

12
22 октября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik

В принцыпе, мне нужны только доменные имена,


Тем более для твое задачи DOM это из пушки по воробъям. DOM будет работать в 10 раз медлее регулрки, не говоря уже про количество потребляемой ОЗУ.

И потом "доменное имя" растяжимое понятие. Доменное имя где? В адресе ссылок на странице?

12
22 октября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik

Вот ещё какая шняга, на локале, под php5,


Цитата: Ghirik

не могу добиться работы этих функций.


Цитата:

XXXI. DOM XML Functions


DOM XML работают в 4-ой версии. zend.ze1_compatibility_mode не включает поддежку работы со старыми функциями. Это просто режим совместимости, для DOM он в принципе выключает вообще не стандартный DOM из работы.

Вообще то на сколько я знаю народ умудрялся на 5-ой версии подрубать DOM XML и на 4 версии умудрялись запускать DOM, но это изврат чистой воды не говоря уже про то, что на это убили кучу времени, да и root-а нужно иметь для такого вида манимуляций.

1.8K
22 октября 2007 года
Ghirik
260 / / 15.03.2007
Ясно, спасибо...

Цитата:
И потом "доменное имя" растяжимое понятие. Доменное имя где? В адресе ссылок на странице?



Если бы в адресной ссылке!!! Таких шаблонов много.... А в этом контенте ссылки есть в разном виде. Вот примеры:

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.
Главное, у меня почему то не получилось искать по всему файлу, вроде и переводов строк нет, а находит только первую ссылку.

1.8K
22 октября 2007 года
Ghirik
260 / / 15.03.2007
Ну вот, почти сделал шаблон.
Нужно было перед выполнением preg_match_all() выполнить addslashes(). Теперь находит все вхождения....

Решил отказаться от DOM полностью, alekciy напугал скоростью..:)
12
22 октября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik
Ну вот, почти сделал шаблон.
Решил отказаться от DOM полностью, alekciy напугал скоростью..:)


Что быстрее регулярное выражение или DOM?

1.8K
25 октября 2007 года
Ghirik
260 / / 15.03.2007
Что быстрее регулярное выражение или DOM?
Я догадывался что регулярка быстрее, DOM и в JavaScript тормозит прилично, особенно заметно в циклах.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог