Решил сделать рекурсивный обход, читая регулярными выраженями. С маленькими текстами где несколько тегов всё работает. А где большие ничего не находит. В чём может быть проблема?
Вот собсно код
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?PHP
- class Teg{
- var $name;
- var $size;
- var $bgcolor;
- var $txtcolor;
- var $align;
- var $valign;
- var $font;
- var $U;
- var $I;
- var $B;
- var $S;
- $this->name=$teg->name;
- $this->size=$teg->size;
- $this->bgcolor=$teg->bgcolor;
- $this->txtcolor=$teg->txtcolor;
- $this->align=$teg->align;
- $this->valign=$teg->valign;
- $this->font=$teg->font;
- $this->U=$teg->U;
- $this->I=$teg->I;
- $this->B=$teg->B;
- $this->S=$teg->S;
- }
- }
- $count_prev_teg=1; //количество тегов родителей
- function def_teg(){
- $_teg=new Teg;
- $_teg->size=3;
- $_teg->bgcolor="#FFFFFF";
- $_teg->txtcolor="#000000";
- $_teg->align="def";
- $_teg->valign="def";
- $_teg->font="def";
- $_teg->S=0;
- $_teg->B=0;
- $_teg->I=0;
- $_teg->U=0;
- return $_teg;
- }
- $prev_teg[0]=def_teg();
- $count_txt=0; //количество тегов
- function read_attr($si){
- global $count_prev_teg;
- global $prev_teg;
- if(@$si[2]!=""){
- $prev_teg[$count_prev_teg]->size=$si[2];
- }
- if(@$si[4]!=""){
- $prev_teg[$count_prev_teg]->align=$si[4];
- }
- if(@$si[6]!=""){
- $prev_teg[$count_prev_teg]->bgcolor=$si[6];
- }
- if(@$si[8]!=""){
- $prev_teg[$count_prev_teg]->txtcolor=$si[8];
- }
- if(@$si[10]!=""){
- $prev_teg[$count_prev_teg]->valign=$si[10];
- }
- if(@$si[12]!=""){
- $prev_teg[$count_prev_teg]->txtcolor=$si[12];
- }
- }
- function Add_teg($si){
- global $tegs;
- global $count_txt;
- global $count_prev_teg;
- global $prev_teg;
- $prev_teg[$count_prev_teg]=new Teg;
- $prev_teg[$count_prev_teg]->copy($prev_teg[$count_prev_teg-1]);
- preg_replace_callback("/(\s*size=\"|'?([0-9]*)\"|'?\s*)|(\s*align=\"|'?([a-z]*)\"|'?\s*)|(\s*bgcolor=\"|'?([#1-9a-fA-F]*)\"|'?\s*)|(\s*text=\"|'?([#1-9a-fA-F]*)\"|'?\s*)|(\s*valign=\"|'?([a-zA-Z]*)\"|'?\s*)|(\s*color=\"|'?([#a-zA-Z]*)\"|'?\s*)/si","read_attr",$si[2]);
- switch($si[1]){
- case "u":
- $prev_teg[$count_prev_teg]->U=1;
- break;
- case "s":
- $prev_teg[$count_prev_teg]->S=1;
- break;
- case "i":
- $prev_teg[$count_prev_teg]->I=1;
- break;
- case "b":
- $prev_teg[$count_prev_teg]->B=1;
- break;
- case "strong":
- $prev_teg[$count_prev_teg]->B=1;
- break;
- case "center":
- $prev_teg[$count_prev_teg]->align="center";
- break;
- }
- $tegs[$count_txt]=new Teg;
- $tegs[$count_txt]->copy($prev_teg[$count_prev_teg]);
- $tegs[$count_txt]->name=$si[1];
- $count_prev_teg++;
- $count_txt++;
- read($si[3]);
- }
- function read($html){
- global $count_prev_teg;
- $count_prev_teg--;
- }
- read($html);
- for($i=0;$i<$count_txt;$i++){
- echo $tegs[$i]->name."<br>";
- }
- ?>