Форумы портала PHP.SU » PHP » Регулярные выражения » Поиск между тегами

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

1. mikka - 28 Октября, 2018 - 16:35:56 - перейти к сообщению
Здравствуйте!
Задача следующая:
При помощи регулярного выражения необходимо найти и получить всю информацию (текст и ссылки - соответственно латинские и русские символы), которые находятся между двумя тегами </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. }
2. Строитель - 28 Октября, 2018 - 16:59:09 - перейти к сообщению
mikka, опубликуйте пример исходной строки, которую нужно парсить.
3. mikka - 28 Октября, 2018 - 17:10:21 - перейти к сообщению
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>
4. Строитель - 28 Октября, 2018 - 17:24:51 - перейти к сообщению
mikka, это вы привели строку, которую надо получить. А ещё нужна строка, ИЗ которой надо получить. Или я не так понял?
5. mikka - 28 Октября, 2018 - 17:33:18 - перейти к сообщению
строка которую необходимо спарсить представляет собой страницу сайта, она очень большая, а вот этот кусочек кода имеется в ней, для большего понимания публикую немного большую часть
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>
6. Строитель - 28 Октября, 2018 - 18:02:35 - перейти к сообщению
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);
7. mikka - 28 Октября, 2018 - 18:11:50 - перейти к сообщению
теперь получаю ошибку

Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset 18
8. Строитель - 28 Октября, 2018 - 18:14:38 - перейти к сообщению
mikka пишет:
теперь получаю ошибку
Значит вы допустили ошибку при копировании или редактировании моего кода -- я на локальном сервере проверял этот код перед публикацией.
(Добавление)
mikka, покажите, как вы его используете.
9. mikka - 28 Октября, 2018 - 18:48:25 - перейти к сообщению
после удаления в начале регулярного выражения ?<= ошибка ушла и получил практически нужный результат.
использую вот так вот

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.  


Был бы признателен, если бы Вы объяснили принцип работы данного регулярного выражения.
10. Строитель - 28 Октября, 2018 - 20:09:39 - перейти к сообщению
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.
11. mikka - 29 Октября, 2018 - 08:23:24 - перейти к сообщению
версия PHP 5.3.13
Спасибо огромное за помощь и за разъяснения!
12. Строитель - 29 Октября, 2018 - 08:39:39 - перейти к сообщению
mikka пишет:
версия PHP 5.3.13
Обновляйтесь до 7-ки Улыбка
13. mikka - 29 Октября, 2018 - 10:11:51 - перейти к сообщению
Уже в процессе обновления. =)
А данную задачу как-то при помощи phpQuery реализовать возможно?
14. Строитель - 29 Октября, 2018 - 10:39:38 - перейти к сообщению
mikka, ну если почитать доку по phpQuery, то конечно можно.

 

Powered by ExBB FM 1.0 RC1