Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Разделение строки

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Проблема с поиском символов /n/r внутри строки
eleks
Отправлено: 18 Марта, 2024 - 10:43:28
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Март 2024  


Помог: 0 раз(а)




Делаю небольшую утилиту для пакетного исследования (поиск дат публикации) html файлов. При этом столкнулся с проблемой неустойчивого обнаружения символов внутри строки.
Использую следующий алгоритм - читаю файл в строку при помощи функции file_get_contents() и далее разбираю эту строку на отдельные строки, ориентируясь на символы переноса и новой строки \n\r . Эти символы пробовал указывать через слеш '\', а также через chr(), результат аналогичный.
Сначала сделал тестовый вариант:
PHP:
скопировать код в буфер обмена
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <title>
  5. Поиск даты файла
  6. </title>
  7. </head>
  8. <body>
  9. <?PHP
  10.     $tdata = '';
  11.     $data = '';
  12.     if (isset($_REQUEST["name_book"]))
  13.     {
  14.         $name_book = $_POST["name_book"];
  15.         for ($x = 2006; $x <= 2024; $x++)
  16.         {
  17.             $ftr = file_get_contents('arc'.$x.'.html') or die("не удалось открыть файл для чтения");
  18.             echo htmlentities($ftr).'<br>';
  19.             $priz = 1;
  20.             while($priz == 1)
  21.             {
  22.                 $spos = stripos($ftr,"\r\n") or die("не удалось найти конца строки!");
  23.                 $str = trim(substr($ftr,0,$spos));
  24.                 $ftr = trim(substr($ftr,$spos));
  25.                 $flen = strlen($ftr);
  26.                 if ($flen < 20) $priz = 0;
  27.                 echo htmlentities($str).$flen.'<br>';
  28.                 if (str_contains(mb_strtolower($str),'</b></div><br>')) $tdata = $str;
  29.                 if (str_contains($str,$name_book))
  30.                 {
  31.                     $data = $tdata;
  32.                     break;
  33.                 }                  
  34.             }
  35.             if ($data) break;
  36.         }
  37.         echo 'Строка даты =>'.htmlentities($data).'<br>';
  38.     }
  39.     else
  40.     {
  41. ?>
  42. <center>
  43. <form method="post" action="date_search_old.php">
  44. Название книги:
  45. <input type="text" name="name_book">
  46. <br>
  47. <input type=submit value="OK">
  48. </form>
  49. </center>
  50. <?PHP
  51.     }
  52. ?>
  53.  
  54. </body>
  55. </html>

Он прекрасно работает
Затем преобразовал фрагмен в подпрограмму и он перестал работать. Функция stripos() не может найти служебные символы \r\n внутри строки, хотя они там гарантированно присутствуют (проверил при помощи небольшого цикла, который в данный момент закомментирован). В чем проблема? Все вроде-бы также, а не работанет. Огорчение
Вот так выглядит нерабочий вариант:
PHP:
скопировать код в буфер обмена
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <title>
  5. Поиск даты файла
  6. </title>
  7. </head>
  8. <body>
  9. <?PHP
  10. # Поиск даты размещения книги
  11. function poisk($name_book)
  12. {
  13.     $tdata = '';
  14.     $data = '';
  15.     for ($x = 2006; $x <= 2024; $x++)
  16.     {
  17.         $ftr = file_get_contents('arc'.$x.'.html') or die("не удалось открыть файл для чтения");
  18. #        for ($k = 0; $k < strlen($ftr); $k++)
  19. #        {
  20. #            echo dechex(ord($ftr[$k])).' ';
  21. #        }
  22.        $priz = 1;
  23.         while($priz == 1)
  24.         {
  25.             $spos = stripos($ftr,"\r\n") or die("не удалось найти конца строки!");
  26.             $str = trim(substr($ftr,0,$spos));
  27.             $ftr = trim(substr($ftr,$spos));
  28.             if (str_contains(mb_strtolower($str),'</html>')) $priz = 0;
  29.             if (str_contains(mb_strtolower($str),'</b></div><br>')) $tdata = $str;
  30.             if (str_contains($str,$name_book))
  31.             {
  32.                 $data = $tdata;
  33.                 break;
  34.             }                  
  35.         }
  36.         if ($data) break;
  37.     }
  38.     return $data;
  39. }
  40. #
  41.    if (isset($_REQUEST["namebook"]))
  42.     {
  43.         $namebook = $_POST["namebook"];
  44.         echo 'Строка даты =>'.htmlentities(poisk($namebook)).'<br>';
  45.     }
  46.     else
  47.     {
  48. ?>
  49. <center>
  50. <form method="post" action="date_search.php">
  51. Название книги:
  52. <input type="text" name="namebook">
  53. <br>
  54. <input type=submit value="OK">
  55. </form>
  56. </center>
  57. <?PHP
  58.     }
  59. ?>
  60.  
  61. </body>
  62. </html>
 
 Top
eleks
Отправлено: 18 Марта, 2024 - 16:11:12
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Март 2024  


Помог: 0 раз(а)




Решил подготовить HTML файлы для того, чтобы каждый желающий мог проверить работу PHP кода. Однако, к великому удивлению, с тестовыми файлами нерабочий код заработал. Однако Скопировал не содержимое исходного html файла в тестовый и тоже все работает.
Т.е. в исходных файлах есть какое-то непонятное отклонение, которое мешает php-коду правильно определять окончание строк, не смотря на то, что соответствующие служебные символы имеются. Растерялся И что это за отклонение такое? Каким образом php определяет окончание строки?

Рано обрадовался Нахмурился Некоторые файлы проходят, а некоторые нет.
Прикладываю к сообщению архив с файлами. В архиве подборка тестовых архивных файлов и два php файла:
date_search.php - проблемный файл
date_search_old.php - этот вроде работает

Для перебора архивных файлов, в строке, после запуска кода, надо ввести соответствующий год. Например, для вызова arc2007.html надо ввести 2007. Проблемный код, на 2006 реагирует адекватно, а при вводе 2007 не может найти окончание строки. Хотя все html файлы сделаны под копирку.

Похоже разобрался с проблемой.
В предыдущей версии кода я контролировал окончание файла по остаточно длине последней строки. Если менее 20 символов, то уже конец. Такой вариант меня, в принципе, устраивает, но выглядит несколько коряво (а вдруг последняя строка окажется длиннее 20 символов?). В текущей версии кода решил ориентироваться на тег окончания html файла - </html>. И если после </html> нет следующей пустой строки, то код не найдет её конец.
Скачать файл: test.zip
Скачан раз: 12

(Отредактировано автором: 18 Марта, 2024 - 16:59:15)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB