За последние 24 часа нас посетили 26537 программистов и 1511 роботов. Сейчас ищут 843 программиста ...

Помогите пожалуйста решить проблему!!!!!

Тема в разделе "PHP для новичков", создана пользователем Priler, 4 мар 2013.

  1. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Здравствуйте.
    У меня тут такая задача:
    Спарсить HTML страницу и проверить упорядоченность H тегов на странице, в случае если, например, элемент H2 расположен раньше элемента H1 то сообщить об этом и предложить поставить H2 после H1.
    Если в коде, то должно быть так:
    Код (Text):
    1.  
    2. <h1>TXT</h1>
    3. <h2>TXT</h2>
    А не так:
    Код (Text):
    1.  
    2. <h2>TXT</h2>
    3. <h1>TXT</h1>
    Я попытался решить задачу самостоятельно, получилось все, однако скрипт гонит, туповатый получился, помогите его исправить пожалуйста или сделать новый получше.
    Вот скрипт, а именно часть проверки упорядоченности H тегов:
    Код (Text):
    1. //-----------H ТЕГИ BEGIN
    2. echo '<fieldset><legend>Анализ области BODY</legend>';
    3. $i=0;//Создаем счетик i
    4. $i2=0;//Создаем счетчик i2
    5. $attentions = '';
    6. $htitle_count=0;
    7. $is_h1=0;
    8. $is_h2=0;
    9. $is_h3=0;
    10. $is_h4=0;
    11. $is_h5=0;
    12. $is_h6=0;
    13.  
    14. //Цикл который поочередно переберает элементы массива $htags
    15. while ($i<=count($htags['0'])) {
    16. $i2=$i;//Присваиваем счетчику i2 значение счетчика i
    17.  
    18. //Много условий, который позволяют определить первую колонну H тегов    
    19. if(preg_match('|(.*)<h1(.*)>(.*)</h1>|i', $htags[0][$i])==1) {$h=1; $h_txt='H1';}
    20. else if(preg_match('|(.*)<h2(.*)>(.*)</h2>|iUs', $htags[0][$i])==1) {$h=2; $h_txt='H2';}
    21. else if(preg_match('|(.*)<h3(.*)>(.*)</h3>|iUs', $htags[0][$i])==1) {$h=3; $h_txt='H3';}
    22. else if(preg_match('|(.*)<h4(.*)>(.*)</h4>|iUs', $htags[0][$i])==1) {$h=4; $h_txt='H4';}
    23. else if(preg_match('|(.*)<h5(.*)>(.*)</h5>|iUs', $htags[0][$i])==1) {$h=5; $h_txt='H5';}
    24. else if(preg_match('|(.*)<h6(.*)>(.*)</h6>|iUs', $htags[0][$i])==1) {$h=6; $h_txt='H6';}
    25.  
    26. //Ищем H1 тег соответствующий заголовку страницы, причем если таковых больше 1 то сообщить об этом
    27. if (trim(strip_tags($htags['0'][$i])) == trim(strip_tags($title['2'])) and $h==1) {$htitle_count++;}
    28.  
    29. //Цикл который идет в обратную сторону от значения счетчика i2(тобишь i)
    30. //и выполняет задачу поиска неправильно упорядоченных H тегов
    31. while ($i2>=0) {
    32.  
    33. //Много условий, который позволяют определить вторую колонну H тегов    
    34. if(preg_match('|(.*)<h1(.*)>(.*)</h1>|i', $htags[0][$i2])==1) {$h2=1; $h_txt='H1';}
    35. else if(preg_match('|(.*)<h2(.*)>(.*)</h2>|iUs', $htags[0][$i2])==1) {$h2=2; $h2_txt='H2';}
    36. else if(preg_match('|(.*)<h3(.*)>(.*)</h3>|iUs', $htags[0][$i2])==1) {$h2=3; $h2_txt='H3';}
    37. else if(preg_match('|(.*)<h4(.*)>(.*)</h4>|iUs', $htags[0][$i2])==1) {$h2=4; $h2_txt='H4';}
    38. else if(preg_match('|(.*)<h5(.*)>(.*)</h5>|iUs', $htags[0][$i2])==1) {$h2=5; $h2_txt='H5';}
    39. else if(preg_match('|(.*)<h6(.*)>(.*)</h6>|iUs', $htags[0][$i2])==1) {$h2=6; $h2_txt='H6';}
    40.  
    41. //Если анализируемый элемент из первой колонны H тегов меньше по рангу чем анализируемый из второй колонны H тегов элемент,
    42. //то сообщить об этом и посоветовать как лучше сделать
    43. if($h2>$h and $h2!=$h) {
    44. if($h==1 and $is_h1==0) {$is_h1=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H1, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H1. <br />";}
    45. if($h==2 and $is_h2==0) {$is_h2=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H2, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H2. <br />";}
    46. if($h==3 and $is_h3==0) {$is_h3=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H3, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H3. <br />";}
    47. if($h==4 and $is_h4==0) {$is_h4=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H4, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H4. <br />";}
    48. if($h==5 and $is_h5==0) {$is_h5=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H5, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H5. <br />";}
    49. if($h==6 and $is_h6==0) {$is_h6=1; $attentions.= "Элемент $h2_txt расположен раньше элемента H6, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента H6. <br />";}
    50.  
    51. //$attentions.= "Элемент $h2_txt расположен раньше элемента $h_txt, советуем вам соблюдать последовательность и поставить элемент $h2_txt после элемента $h_txt. <br />";
    52. $hnfo = ' Были найдены не соответствия!';
    53. }
    54. $i2--;//уменьшаем счетчик i2 на 1 единицу
    55. }
    56. $i++;//увеличиваем счетчик на 1 единицу
    57. }
    58.  
    59. //Проверяем были ли найдены H теги, если да - то сколько, если нет - то вывести сообщение об отсутствие H тегов на странице
    60. if(count($htags['0'])!=0) {
    61. //Проверяем существует ли в DOM дереве загруженной страницы элемент H1 и есть ли вообще H теги, если нет, то выводим или не выводим предупреждение
    62. if(preg_match('|(.*)<h1(.*)>(.*)</h1>|iU', $html)==0 and count($htags['0'])!=0) {$hnfo = ' Были найдены не соответствия!'; $attentions .=' На странице отсутствует элемент H1! Пожалуйста, обратите на это внимание! <br />';}
    63. }
    64. else {$hnfo = 'отсутствуют, обратите на это внимание!'; $attentions .= ' ';}
    65. if($htitle_count==0) $attentions .= 'На странице отсутствует элемент H1, содержимое которого в точности совпадает с заголовком страницы!<br />';
    66. if($htitle_count>1) {$attentions .= 'Найдено более одного H1 тега, содержимое которого соответствует заголовку страницы! Советуем вам оставить только один H1 элемент, соответствующий заголовку страницы! <br />'; $hnfo = ' Были найдены не соответствия!'; }
    67.  
    68. if($attentions!='') $ats='bad'; else {$ats='good'; $h_count = '<div id="htags"> Найдено H тегов: '.count($htags['0']).'<br />'; $hnfo='Соответствуют общепринятым нормам!';}
    69. echo '<fieldset class='.$ats.'><legend>H теги - '.$hnfo.'</legend>';
    70. echo $h_count;
    71. echo $attentions;
    72. echo '</fieldset></div>';
    73. }
    74. //-----------H ТЕГИ END
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (PHP):
    1. if (strpos($text,'<h2>') < strpos($text,'<h1>')) {
    2.  echo 'Сообщаю что  H1 идет после H2 и предлогаю переставить их';
    3. }
     
  3. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    runcore, спасибо друг!
    Сильно помог.
    Даже не знал что так можно легко уместить 100500 строк в 3 строчки и работать будет лучше)))
    Век живи - век учись
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это если в теги ничего не напихуто лишнего
     
  5. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    =D
    Код (PHP):
    1. if (strpos($text,'<h2') < strpos($text,'<h1')) {
    2.  echo 'Сообщаю что  H1 идет после H2 и предлогаю переставить их';
    3. } 
     
  6. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    igordata, я знаю, я делал </h1> а теперь буду еще лучше делать, как подсказал siiXth а именно <h1
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    воистину! =)
     
  8. FalkoN

    FalkoN Активный пользователь

    С нами с:
    1 апр 2011
    Сообщения:
    184
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Ну, чтобы уж совсем было хорошо:

    Код (Text):
    1.  
    2. if (strpos($text,'<h2') < strpos($text,'<h1')) {
    3.  echo 'Сообщаю, что  H1 идет после H2, и предлАгаю переставить их';
    4. }
     
  9. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Ну, чтобы уж совсем-совсем было хорошо:
    Код (PHP):
    1. $p1 = strIpos($text,'<h1');
    2. $p2 = strIpos($text,'<h2');
    3. if ($p1!==false && $p2!==false && $p1>$p2) {
    4.  echo 'Сообщаю, что H1 идет после H2, и предлагаю переставить их';
    5. } 
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Вот это грамотно. Это по-взрослому.
     
  11. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    ) У меня так и написано