Парсер html

php@max

Новичок
Парсер html

Нужен Парсер html, попытался написать, вот, что вышло:


<?php
$filename = "999.html";
$fd = fopen($filename, "a+");
$bufer = fread($fd, filesize($filename));
$musor = array("/ <b >ccc<\/b>/", "/ <b > vvv<\/b>/", "/ <b > 768778 <\/b>/",
"/<b > 56877 <\/b>/", "/ <b > 87978 <\/b>/", "/<b > <\/b>/");
$subject = $filename;
$patern = $musor;
$replacment = "\\1";
preg_replace($patern, $replacment, $subject);

preg_replace("#<[\s]*b[\s]*>([^<]*)<[\s]*=[\s]*>#i", $replacment, $subject);

preg_match_all ("#<[\s]*b[\s]*>([^<]*)<[\s]*/b[\s]*>#i", $bufer, $text);

fwrite($fd, $bufer);

fclose($fd);

print_r($text);
?>



1) Конструкция preg_replace не хочет работать, и значения, указаные в одномерном массиве $musor все равно выводятся.
$musor = array("/ <b >ccc<\/b>/", "/ <b > vvv<\/b>/", "/ <b > 768778 <\/b>/",
"/<b > 56877 <\/b>/", "/ <b > 87978 <\/b>/", "/<b > <\/b>/");
$subject = $filename;
$patern = $musor;
$replacment = "\\1";
preg_replace($patern, $replacment, $subject);

2) Как сделать так, чтоб в после этой конструкции:
preg_match_all ("#<[\s]*b[\s]*>([^<]*)<[\s]*/b[\s]*>#i", $bufer, $text);
в $text все значения выводились в такой же форме, как и в html файле. Точнее, в html файле в каждой строке находится определенное кол-во значений, и необходимо, чтоб в выводимой переменной все было также.
Нумерация значений в переменной $text начиналась заново с каждой строчки, например:
1) [1]=>a [2]=>b [3]=>c
2) [1]=>g [2]=>d [3]=>y
и т.д.
 

phprus

Moderator
Команда форума
Если у тебя php5 то можеш использовать это:
http://www.php.net/manual/en/function.dom-domdocument-loadhtml.php

Однако из приведенного кода и текста не понял ни слова по этому дал ответ на вопрос поставленный в заголовке.
 

hermit_refined

Отшельник
php@max
Удивлюсь, если preg-функции поймут, чего вам от них надобно. А гадать они не умеют.

Локализуйте хоть свою проблему, например - "у меня есть такая-то строка, я хочу с неё получить вот это (неплохо бы знать - зачем), делаю вот так - и ни хрена".
 

php@max

Новичок
Нужно из строки (например)
<b >333 </b> 444 <b > 777</b> 576657 <b > +1.0=>qwerty</b>
Все обрезать и оставить
1) [1]=>333 [2]=>444 [3]=>qwerty
 

RushHourRider

Новичок
PHP:
$str = "<b >333 </b> 444 <b > 777</b> 576657 <b > +1.0=>qwerty</b>";
$regex = "~[\s\w]\>([^\<\/]*)\<\/~";
preg_match_all($regex, $str, $m);
print_r($m[1]);
 

php@max

Новичок
PHP:
$str = "<b >333 </b> 444 <b > 777</b> 576657 <b > +1.0=>qwerty</b>";
$regex = "~[\s\w]\>([^\<\/]*)\<\/~";
preg_match_all($regex, $str, $m);
print_r($m[1]);
Но все дело в том, что в качестве $str должен выступать html файл, заполненый такими строчками, и нужно чтоб с каждой новой строки нумерация начиналась с начала.
А зачем это нужно?
ЧТоб потом я смог обращаться к каждой строчке и производить с ней, по отдельности, вычисления.
 

JamES

Новичок
используй библиотеку tidy, и очень быстро решишь свою проблему

-~{}~ 08.10.06 12:46:

http://php.net/tidy
 

Wicked

Новичок
Андрейка
DOM расценил строку
$str = "<b >333 </b> 444 <b > 777</b> 576657 <b > +1.0=>qwerty</b>";
как
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><b>333 </b> 444 <b> 777</b> 576657 <b> +1.0=&amp;gt;qwerty</b></body></html>

-~{}~ 09.10.06 11:42:

и мне кажется, что Tidy сделает так же
 

Андрейка

Senior pomidor developer
та мона было в ие глянуть и не мучицца - +1.0=> qwerty...
а автору вроде нужно было qwerty
 

php@max

Новичок
Да, из строк типа
<b > +1.0=>qwerty</b>
нужно оставить только qwerty
 

hermit_refined

Отшельник
Но все дело в том, что в качестве $str должен выступать html файл, заполненый такими строчками, и нужно чтоб с каждой новой строки нумерация начиналась с начала.
Да, из строк типа <b > +1.0=>qwerty</b> нужно оставить только qwerty
Это уже не HTML.
Простите, а можете просветить насчёт практической полезности всей этой белиберды? Откуда берётся сей текст, почему выбирать надо именно так и для чего?
 

Wicked

Новичок
hermit_refined
откуда-откуда... ворованный контент с других сайтов :)
 

hermit_refined

Отшельник
Wicked
Ну это-то понятно ;-)
Мне тоже где-то год назад пришлось писать 50 парсеров под разные новостные сайты (для поиска), но мне как-то не приходила в голову светлая мысль учитывать переводы строки и изобретать свои модификации HTML. На всякой странице присутствует некая логика в комбинациях тегов и этой логики обычно вполне достаточно.
 

php@max

Новичок
Нет, просто на этой странице есть цифровые значения, которые надо слить и провести через несколько математических формул, и те полученые результаты, которые мне нужны, показать мне. Просто можно и в ручную, но на это будет уходить уйма времени постоянно.
Всетаки, можно сделать так, как надо, не прибегая в извращениям типа тиди ?

-~{}~ 09.10.06 23:00:

Все, конец моим надеждам, там не все числа находятся между тегами ((( Я только заметил (( . Может возможно ?

Строчка вида

<b >2.40 </b> 1.55 <b > +1.5=>1.80</b> -1.5=>1.95 <b > 9.0</b> 1.95 1.80 <b > 4.0</b> 1.75 1.95 <b > 5.0</b> 1.95 1.75

Из нее надо оставить только

2.40 1.55 1.80 1.95 9.0 1.95 1.80 4.0 1.75 1.95 5.0 1.95 1.75
 

php@max

Новичок
nofx
Зачем мне str_replace я все лишнее обрезал давно, прочитай пост мой последний.
Я в тупике ..
 
php@max
ты пишешь
Строчка вида

<b >2.40 </b> 1.55 <b > +1.5=>1.80</b> -1.5=>1.95 <b > 9.0</b> 1.95 1.80 <b > 4.0</b> 1.75 1.95 <b > 5.0</b> 1.95 1.75

Из нее надо оставить только

2.40 1.55 1.80 1.95 9.0 1.95 1.80 4.0 1.75 1.95 5.0 1.95 1.75
а я говорю воспользуйся str_replace и удали все лишнее...
из твоего последнего поста #post657378, данных о том что, ты давно все уже сделал, я не увидел...
 
Сверху