Здравствуйте. У меня тут такая задача: Спарсить HTML страницу и проверить упорядоченность H тегов на странице, в случае если, например, элемент H2 расположен раньше элемента H1 то сообщить об этом и предложить поставить H2 после H1. Если в коде, то должно быть так: Код (Text): <h1>TXT</h1> <h2>TXT</h2> А не так: Код (Text): <h2>TXT</h2> <h1>TXT</h1> Я попытался решить задачу самостоятельно, получилось все, однако скрипт гонит, туповатый получился, помогите его исправить пожалуйста или сделать новый получше. Вот скрипт, а именно часть проверки упорядоченности H тегов: Код (Text): //-----------H ТЕГИ BEGIN echo '<fieldset><legend>Анализ области BODY</legend>'; $i=0;//Создаем счетик i $i2=0;//Создаем счетчик i2 $attentions = ''; $htitle_count=0; $is_h1=0; $is_h2=0; $is_h3=0; $is_h4=0; $is_h5=0; $is_h6=0; //Цикл который поочередно переберает элементы массива $htags while ($i<=count($htags['0'])) { $i2=$i;//Присваиваем счетчику i2 значение счетчика i //Много условий, который позволяют определить первую колонну H тегов if(preg_match('|(.*)<h1(.*)>(.*)</h1>|i', $htags[0][$i])==1) {$h=1; $h_txt='H1';} else if(preg_match('|(.*)<h2(.*)>(.*)</h2>|iUs', $htags[0][$i])==1) {$h=2; $h_txt='H2';} else if(preg_match('|(.*)<h3(.*)>(.*)</h3>|iUs', $htags[0][$i])==1) {$h=3; $h_txt='H3';} else if(preg_match('|(.*)<h4(.*)>(.*)</h4>|iUs', $htags[0][$i])==1) {$h=4; $h_txt='H4';} else if(preg_match('|(.*)<h5(.*)>(.*)</h5>|iUs', $htags[0][$i])==1) {$h=5; $h_txt='H5';} else if(preg_match('|(.*)<h6(.*)>(.*)</h6>|iUs', $htags[0][$i])==1) {$h=6; $h_txt='H6';} //Ищем H1 тег соответствующий заголовку страницы, причем если таковых больше 1 то сообщить об этом if (trim(strip_tags($htags['0'][$i])) == trim(strip_tags($title['2'])) and $h==1) {$htitle_count++;} //Цикл который идет в обратную сторону от значения счетчика i2(тобишь i) //и выполняет задачу поиска неправильно упорядоченных H тегов while ($i2>=0) { //Много условий, который позволяют определить вторую колонну H тегов if(preg_match('|(.*)<h1(.*)>(.*)</h1>|i', $htags[0][$i2])==1) {$h2=1; $h_txt='H1';} else if(preg_match('|(.*)<h2(.*)>(.*)</h2>|iUs', $htags[0][$i2])==1) {$h2=2; $h2_txt='H2';} else if(preg_match('|(.*)<h3(.*)>(.*)</h3>|iUs', $htags[0][$i2])==1) {$h2=3; $h2_txt='H3';} else if(preg_match('|(.*)<h4(.*)>(.*)</h4>|iUs', $htags[0][$i2])==1) {$h2=4; $h2_txt='H4';} else if(preg_match('|(.*)<h5(.*)>(.*)</h5>|iUs', $htags[0][$i2])==1) {$h2=5; $h2_txt='H5';} else if(preg_match('|(.*)<h6(.*)>(.*)</h6>|iUs', $htags[0][$i2])==1) {$h2=6; $h2_txt='H6';} //Если анализируемый элемент из первой колонны H тегов меньше по рангу чем анализируемый из второй колонны H тегов элемент, //то сообщить об этом и посоветовать как лучше сделать if($h2>$h and $h2!=$h) { if($h==1 and $is_h1==0) {$is_h1=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H1, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H1. <br />";} if($h==2 and $is_h2==0) {$is_h2=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H2, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H2. <br />";} if($h==3 and $is_h3==0) {$is_h3=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H3, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H3. <br />";} if($h==4 and $is_h4==0) {$is_h4=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H4, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H4. <br />";} if($h==5 and $is_h5==0) {$is_h5=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H5, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H5. <br />";} if($h==6 and $is_h6==0) {$is_h6=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H6, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H6. <br />";} //$attentions.= "Элемент $h2_txt расположен раньше элемента $h_txt, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента $h_txt. <br />"; $hnfo = ' Были найдены не соответствия!'; } $i2--;//уменьшаем счетчик i2 на 1 единицу } $i++;//увеличиваем счетчик на 1 единицу } //Проверяем были ли найдены H теги, если да - то сколько, если нет - то вывести сообщение об отсутствие H тегов на странице if(count($htags['0'])!=0) { //Проверяем существует ли в DOM дереве загруженной страницы элемент H1 и есть ли вообще H теги, если нет, то выводим или не выводим предупреждение if(preg_match('|(.*)<h1(.*)>(.*)</h1>|iU', $html)==0 and count($htags['0'])!=0) {$hnfo = ' Были найдены не соответствия!'; $attentions .=' На странице отсутствует элемент H1! Пожалуйста, обратите на это внимание! <br />';} } else {$hnfo = 'отсутствуют, обратите на это внимание!'; $attentions .= ' ';} if($htitle_count==0) $attentions .= 'На странице отсутствует элемент H1, содержимое которого в точности совпадает с заголовком страницы!<br />'; if($htitle_count>1) {$attentions .= 'Найдено более одного H1 тега, содержимое которого соответствует заголовку страницы! Советуем вам оставить только один H1 элемент, соответствующий заголовку страницы! <br />'; $hnfo = ' Были найдены не соответствия!'; } if($attentions!='') $ats='bad'; else {$ats='good'; $h_count = '<div id="htags"> Найдено H тегов: '.count($htags['0']).'<br />'; $hnfo='Соответствуют общепринятым нормам!';} echo '<fieldset class='.$ats.'><legend>H теги - '.$hnfo.'</legend>'; echo $h_count; echo $attentions; echo '</fieldset></div>'; } //-----------H ТЕГИ END
Код (PHP): if (strpos($text,'<h2>') < strpos($text,'<h1>')) { echo 'Сообщаю что H1 идет после H2 и предлогаю переставить их'; }
runcore, спасибо друг! Сильно помог. Даже не знал что так можно легко уместить 100500 строк в 3 строчки и работать будет лучше))) Век живи - век учись
=D Код (PHP): if (strpos($text,'<h2') < strpos($text,'<h1')) { echo 'Сообщаю что H1 идет после H2 и предлогаю переставить их'; }
Ну, чтобы уж совсем было хорошо: Код (Text): if (strpos($text,'<h2') < strpos($text,'<h1')) { echo 'Сообщаю, что H1 идет после H2, и предлАгаю переставить их'; }
Ну, чтобы уж совсем-совсем было хорошо: Код (PHP): $p1 = strIpos($text,'<h1'); $p2 = strIpos($text,'<h2'); if ($p1!==false && $p2!==false && $p1>$p2) { echo 'Сообщаю, что H1 идет после H2, и предлагаю переставить их'; }