PHP.SU

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


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

> Без описания
mikka
Отправлено: 28 Октября, 2018 - 16:35:56
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2018  


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




Здравствуйте!
Задача следующая:
При помощи регулярного выражения необходимо найти и получить всю информацию (текст и ссылки - соответственно латинские и русские символы), которые находятся между двумя тегами </script> и <br>. Данная информация не находится ни в <div> ни в таблице, она просто выводится скриптом. На странице много тегов </script> и <br>, но всего лишь одна комбинация когда после </script> идут текст и ссылка, а после них тег <br>. Получить результат пытаюсь при помощи следующего кода, но получаю bool(false).
P.S. в переменной $url хранится адрес страницы, с которой пытаюсь спарсить инфо
PHP:
скопировать код в буфер обмена
  1. function get_content($url){
  2.         $content = file_get_contents($url);
  3.         $katalog_link = array();
  4.         $katalog_link=preg_match_all('/<\/script>(.*?)<br>/uis',$content, $katalog_link);
  5.         return $katalog_link;
  6. }
 
 Top
Строитель Модератор
Отправлено: 28 Октября, 2018 - 16:59:09
Post Id



Участник


Покинул форум
Сообщений всего: 1363
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




mikka, опубликуйте пример исходной строки, которую нужно парсить.
 
 Top
mikka
Отправлено: 28 Октября, 2018 - 17:10:21
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2018  


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




PHP:
скопировать код в буфер обмена
  1.  
  2. </script>
  3. <a href="http://site.ru/monitor/?menu=products&edit=1108&88066504932163">Зарядные устройства, аккумуляторы</a> » <a href="http://site.ru/monitor/?menu=products&edit=1747&6067337044425">внешние аккумуляторы</a> » <br><a href="http://site.ru/monitor/?menu=products&edit=1&4572837043506&highlight=6061#6061"><b><< вернуться в каталог</b></a>
 
 Top
Строитель Модератор
Отправлено: 28 Октября, 2018 - 17:24:51
Post Id



Участник


Покинул форум
Сообщений всего: 1363
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




mikka, это вы привели строку, которую надо получить. А ещё нужна строка, ИЗ которой надо получить. Или я не так понял?
 
 Top
mikka
Отправлено: 28 Октября, 2018 - 17:33:18
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2018  


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




строка которую необходимо спарсить представляет собой страницу сайта, она очень большая, а вот этот кусочек кода имеется в ней, для большего понимания публикую немного большую часть
PHP:
скопировать код в буфер обмена
  1. <script type="text/javascript" src="./Товары _files/ckeditor.js.Без названия"></script>
  2. <table width="100%" border="0" cellpadding="0" cellspacing="5" class="text" bgcolor="#FAFAFA">
  3.   <tbody><tr>
  4.     <td bgcolor="#C0C0C0" valign="top" width="1"><img src="./Товары_files/spacer.gif" width="1" height="1" border="0"></td>
  5.     <td width="50%" valign="top">
  6.  
  7. <script>
  8. function checkregform()
  9. {
  10.         name = document.getElementById('name').value;
  11. //      price = document.getElementById('price').value;
  12.   man =  document.getElementById('man').value;
  13.  
  14.         error = false;
  15.  
  16.         if(name == '')
  17.         error = 'не указано наименование товара';
  18.  
  19.         if(man == '0' && newm=='')
  20.         error = 'не указан производитель товара';
  21.  
  22.         if(!error)
  23.         return true;
  24.         else
  25.         {
  26.                 alert(error);
  27.                 return false;
  28.         }
  29. }
  30. </script>
  31. <a href="http://site.ru/monitor/?menu=products&edit=1108&88066504932163">Зарядные устройства, аккумуляторы</a> » <a href="http://site.ru/monitor/?menu=products&edit=1747&6067337044425">внешние аккумуляторы</a> » <br><a href="http://site.ru/monitor/?menu=products&edit=1&4572837043506&highlight=6061#6061"><b><< вернуться в каталог</b></a>
  32. <a href="http://site.ru/monitor/?menu=products&edit=1747&324337048278&highlight=6061#6061"><b><< перейти в каталог товара</b></a>
  33.  
  34. <script language="Javascript1.2"><!-- // load htmlarea
  35. _editor_url = "/monitor/menus/products/"; // URL to htmlarea files
  36. var win_ie_ver = parseFloat(navigator.appVersion.split("MSIE")[1]);
  37. if (navigator.userAgent.indexOf('Mac')        >= 0) { win_ie_ver = 0; }
  38. if (navigator.userAgent.indexOf('Windows CE') >= 0) { win_ie_ver = 0; }
  39. if (navigator.userAgent.indexOf('Opera')      >= 0) { win_ie_ver = 0; }
  40. if (win_ie_ver >= 5.5) {
  41.         document.write('<scr' + 'ipt src="' +_editor_url+ 'editor.js"');
  42.         document.write(' language="Javascript1.2"></scr' + 'ipt>');
  43. } else { document.write('<scr'+'ipt>function editor_generate() { return false; }</scr'+'ipt>'); }
  44. // -->
  45. </script><script>function editor_generate() { return false; }</script>
 
 Top
Строитель Модератор
Отправлено: 28 Октября, 2018 - 18:02:35
Post Id



Участник


Покинул форум
Сообщений всего: 1363
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




mikka, вроде так?
PHP:
скопировать код в буфер обмена
  1. $str = ''; // Исходная строка
  2.  
  3. $pcre = "~(?<=</script>\r\n|\h)<a[^>]*>(.+?)</a>~s";
  4. preg_match_all($pcre, $str, $arr);
  5.  
  6. echo '<pre>';
  7. print_r($arr);
 
 Top
mikka
Отправлено: 28 Октября, 2018 - 18:11:50
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2018  


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




теперь получаю ошибку

Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset 18
 
 Top
Строитель Модератор
Отправлено: 28 Октября, 2018 - 18:14:38
Post Id



Участник


Покинул форум
Сообщений всего: 1363
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




mikka пишет:
теперь получаю ошибку
Значит вы допустили ошибку при копировании или редактировании моего кода -- я на локальном сервере проверял этот код перед публикацией.
(Добавление)
mikka, покажите, как вы его используете.
 
 Top
mikka
Отправлено: 28 Октября, 2018 - 18:48:25
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2018  


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




после удаления в начале регулярного выражения ?<= ошибка ушла и получил практически нужный результат.
использую вот так вот

PHP:
скопировать код в буфер обмена
  1.  
  2. function get_content($url){
  3.         $content = file_get_contents($url);
  4.         $pcre = "~(</script>\r\n|\h)<a[^>]*>(.+?)</a>~s";
  5.         preg_match_all($pcre,$content,$katalog_link);
  6.         return $katalog_link;
  7. }
  8.  
  9. url='http://test1.ru/';
  10. $nameNum=get_content($url);
  11. print_arr($nameNum);
  12.  


Был бы признателен, если бы Вы объяснили принцип работы данного регулярного выражения.
 
 Top
Строитель Модератор
Отправлено: 28 Октября, 2018 - 20:09:39
Post Id



Участник


Покинул форум
Сообщений всего: 1363
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




mikka пишет:
после удаления в начале регулярного выражения ?<= ошибка ушла
Это ж какая версия php у вас используется? O.о

Если у вас не поддерживается Ретроспективная проверка, тогда можно просто сгруппировать НЕ сохраняющими скобками (?:...)
Спойлер (Отобразить)
Искомая подстрока будет соответствовать шаблону, если:

1. Начинается с тега </script> после которого обязательно следуют символы перевода каретки и новой строки \r\n, или | символ горизонтального отступа (пробел) \h.
Описанную выше последовательность символов необходимо сгруппировать с помощью конструкции не сохраняющих скобок:
(?: </script> \r\n | \h )

2. Далее ожидается html-тег <a, за которым может следовать любая последовательность символов, кроме символа >, и эта последовательность символов должна заканчиваться символом >:
<a[^>]*>

3. Далее следует любая группа символов .+?, за которой обязательно должен следовать закрывающий html-тег </a>. Обратите внимание, что для "захвата" группы символов между html-тегами <a[^>]*> и </a> в отдельный элемент массива, используется захватывающая группировка ( .+? ):
<a[^>]*>(.+?)</a>

4. Символы ~ - это ограничители шаблона.

5. Модификатор s - задаёт режим соответствия для символьного класса "." (точка - это символьный класс в регулярных выражениях).
По умолчанию символ "." соответствует почти любому символу, кроме символа перевода на новую строку (и ещё каких-то непечатаемых символов, точно не помню). Для включения режима полного соответствия любому символу, в конец шаблона добавляется модификатор s.
 
 Top
mikka
Отправлено: 29 Октября, 2018 - 08:23:24
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2018  


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




версия PHP 5.3.13
Спасибо огромное за помощь и за разъяснения!
 
 Top
Строитель Модератор
Отправлено: 29 Октября, 2018 - 08:39:39
Post Id



Участник


Покинул форум
Сообщений всего: 1363
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




mikka пишет:
версия PHP 5.3.13
Обновляйтесь до 7-ки Улыбка
 
 Top
mikka
Отправлено: 29 Октября, 2018 - 10:11:51
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2018  


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




Уже в процессе обновления. =)
А данную задачу как-то при помощи phpQuery реализовать возможно?

(Отредактировано автором: 29 Октября, 2018 - 10:12:40)

 
 Top
Строитель Модератор
Отправлено: 29 Октября, 2018 - 10:39:38
Post Id



Участник


Покинул форум
Сообщений всего: 1363
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




mikka, ну если почитать доку по phpQuery, то конечно можно.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Регулярные выражения »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB