Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Регулярные выражения (RegExp, Regular, eregi, preg)

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

Rendom



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Учебники регулярных выражений
 
Кто сможет составить выражение для такого случая:

Код:
 
<table border=0>
<tr>
   <td>blablablabla<table border=0><tr><td>blablabla_UNIQTEXT_blablabla</td></tr></table></td>
   <td><table border=1><tr><td>blablabla</td></tr></table>666666</td>
</tr
</table>
 

Нужно удалить из этого всего кусок "<table border=0><tr><td>blablabla_UNIQTEXT_blablabla</td></tr></table>". Иными словами нужно вырезать текст от "<table" до "</table>" внутри которого есть строка "UNIQTEXT", но при этом не удалить лишнего. В результате должно получиться:

Код:
 
<table border=0>
<tr>
   <td>blablablabla</td>
   <td><table border=1><tr><td>blablabla</td></tr></table>666666</td>
</tr
</table>
 

Всего записей: 115 | Зарегистр. 27-10-2002 | Отправлено: 23:26 17-05-2005 | Исправлено: AZJIO, 04:05 09-12-2014
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Brodyaga
Согласен, но они не простые программисты, они почти БОГИ!
 
Вот что я заметил сегодня в оф. документации

Цитата:
int preg_match_all ( string pattern, string subject, array &matches [, int flags [, int offset]] )
 
Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags.
 
После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

Есть идея написать свой preg_match_all на базе preg_match хотя это должен делать не я а профессионал, ибо я тоже могу допустить ошибку Как что-то проясниться обязательно скину

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 14:45 09-09-2006
DLans

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Думаю вопрос сюда.
 
В общем, я кое-что понял в регулярных выражениях..
Кроме этого.
 
Например BB тег URL реализуется так:

Код:
 
 $emsg = preg_replace("#\[url=(.*?)\](.*?)\[/url\]#si", "<a class=\"links\" target=\"_blank\" href=\"\\1\">\\2</a>", $emsg);  
        $emsg = preg_replace("#\[url\](.*?)\[/url\]#si", "<a class=\"links\" target=\"_blank\" href=\"\\1\">\\1</a>", $emsg);
 

 
Что означает:
\\1  
?

Всего записей: 197 | Зарегистр. 05-01-2006 | Отправлено: 15:16 09-09-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DLans
Два слеша а за ним цифра означает индекс елемента в "совпадениях", подробно написано вот здесь, да еще и на русском
http://uk.php.net/manual/ru/function.preg-replace.php
Удачи

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 17:44 09-09-2006 | Исправлено: Delphi6, 17:46 09-09-2006
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6

Цитата:
после того как найдутся все таблицы, вручную рекурсивно искать таблицы в уже полученных таблицах

Не понял, зачем?
Предположим что таблицы не будут иметь вложенность больше 15 - тогда разбирается регекспом!

Цитата:
Хотя я не могу скрыть недовольство и такой большой промах со стороны рег. выражений!

Регулярные выражения отлично с этим справляются.

Цитата:
Как можно было не учесть такого банального варианта?  

Дык всё учтено. Регекспы (в перле ) с этим справляются )
 


----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 17:44 09-09-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KADABRA

Цитата:
Дык всё учтено. Регекспы (в перле ) с этим справляются )

А мне что сейчас язык программирования метянть? Я уже с РНР как одно целое
 

Цитата:
Предположим что таблицы не будут иметь вложенность больше 15 - тогда разбирается регекспом!  

Что-то в этом варианте мне не нравиться, не могу точно сказать что, но интуиция подсказывает, дело здесь не чисто
 
По идее есть еще одно решение, надо воспользоваться ручным отступом, это самое подходящее, так как вариант с <td>val1<td>val2<td>val3<td> ничего кроме полу ручной обработки не  поможет. Или я ошибаюсь делая такое заявление?

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 17:51 09-09-2006
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6

Цитата:
Что-то в этом варианте мне не нравиться, не могу точно сказать что, но интуиция подсказывает, дело здесь не чисто  

Тот код что я дал отлично справляется с тем ХТМЛ что ты дал, да и с любык, в котором таблицы вложенности не более 3, ты его пробовал или нет?
 

Цитата:
А мне что сейчас язык программирования метянть? Я уже с РНР как одно целое  

Ну иногда оказывается что выбран не оптимальный язык
 

Цитата:
По идее есть еще одно решение, надо воспользоваться ручным отступом, это самое подходящее, так как вариант с <td>val1<td>val2<td>val3<td> ничего кроме полу ручной обработки не  поможет. Или я ошибаюсь делая такое заявление?  

Всё можно сделать вручную. Но иногда лучше автоматизировать. И иногда можно автоматизировать то, то кажется невозможно
А на счёт
Цитата:
<td>val1<td>val2<td>val3<td>

Щас посмотрю..
 
 
Добавлено:
<td>val1<td>val2<td>val3<td>
Кстати, это не валидный xhtml.
 
Добавлено:
Щас ничего в голову не приходит...

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 18:06 09-09-2006
DLans

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6
спасибо!

Всего записей: 197 | Зарегистр. 05-01-2006 | Отправлено: 18:25 09-09-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6
проблема с таблицами заключается в том, что preg_match начинает поиск с начала. и первые <table></table> попадают под маску.


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 18:26 09-09-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Вот именно попадают первая таблица (он же и минимальный с самого начала), а каждый последующий поиск происходит с места где заканчивается первая таблица. Вот и получается что внутренняя таблица исключается
Нужно наверно заюзать:

Цитата:
...После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения...

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 18:43 09-09-2006
user128



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Надо удалить все аттрибуты у всех тегов, кроме a, p, img.

Код:
preg_replace("!<([a-z]+)[^>]*>!is", "<\\1>", $string);

Это удаляет у всех.
Как поставить ограничение понять не могу
 
Помогите пожалуйста

Всего записей: 208 | Зарегистр. 03-01-2004 | Отправлено: 20:01 27-09-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
user128
("!<([^ap(img)]?)\s[^>]*>!
не проверял
 
ps: нет, не пашет.. подумаю, когда будет время
 
pps: вот
Код:
preg_replace("/<([^ap(img)].*?)\s.*?>/is", "<\\1>", $string);  


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:26 27-09-2006 | Исправлено: Cheery, 20:53 27-09-2006
Terabyte



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите составить две регулярки: Для ввода мыла и ФИО (на англ).
 
Для мыла нашел:
preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/",$email)
Но она пропускает мыла test@test.ru88 (т.е. цифры в домене верхнего уровня).
 
Для проверки ФИО вообще не понял, ошибку выдает:
preg_match("^[\-a-zA-Z_ ]+$",$name)
 
Спасибо.

Всего записей: 1325 | Зарегистр. 09-09-2002 | Отправлено: 09:22 02-10-2006 | Исправлено: Terabyte, 09:23 02-10-2006
Smle

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно запретить поиск меньше чем по 3м символам.  
Знаю что .* означает здесь ноль и больше символов. Регулярные отношения изучаю;)  
   
#$text =~ s/\n/<br>/sg;  
#$text =~ s/\[b\]/<b>/sg;  
#$text =~ s/\[\/b\]/<\/b>/sg;  
$text =~ s/\[quote\]/Цитата:/sg;  
$text =~ s/\[\/quote\]//sg;  
   
$text =~ s/\[url\](.*?)\[\/url\]//sg;  
$text =~ s/\[url\=(.*?)\](.*?)\[\/url\]//sg;  
   
$text =~ s/\[img\](.*?)\[\/img\]//sg;  
$text =~ s/\[img\=(.*?)\](.*?)\[\/img\]//sg;
 
если вместо (.*?) вставлю {3,} то ничего не меняется. Также продолжает искать по одной и по двум буквам (




читаем правила.. впрочем, тебе это уже не поможет /Cheery/

Всего записей: 10 | Зарегистр. 05-10-2006 | Отправлено: 14:30 10-10-2006 | Исправлено: Cheery, 14:55 10-10-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброе время суток,
Как можно выбрать не просто все урлы в HTML странице а те которые не начинаются на http://, другими словами локальные.  

Код:
preg_match_all("#\s(?:href|src|url)=(?:[\"\'])?(.*?)(?:[\"\'])?(?:[\s\>])#i", $buffer, $matches);

Спасибо

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 19:17 22-10-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Почему данное рег. выражение не отлавливает все параметры?

Код:
<?php  $string = '<table border="0"       cellpadding  =   "0" cellspacing=0 style="border-collapse: collapse">';
  if (preg_match_all('#\s+([^=\s]+)\s*=\s*(?(?=") "([^"]+)" | ([^\s]+))#is', $string, $matches)) {
    print_r($matches);
  }
?>

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 17:54 22-11-2006
Brodyaga



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Может такое подойдет? от Perl:
/([-_\w:]+) \s* ( = \s* (?> ("[^"\"\=]*" | '[^'\'\=]*' | \S*) ) )?/xs

----------
Damn Metal

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 17:56 22-11-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6
Или такое на PHP:
preg_match_all('/([a-z_\-]+)\s*=\s*(\'[^\']*\'|"[^"]*"|[a-z_\-0-9]+)/i', $string, $matches);

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 18:41 22-11-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Brodyaga
sTa1kEr
Супер, как то не сообразил что можно вставить все в OR Сейчас уже не могу сообразить насколько код подойдет но на 90% уверен что это то что нужно
Спасибо

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 22:31 22-11-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Brodyaga
sTa1kEr
ВСЕ УДАЛИЛ ТАК КАК НАШЕЛ РЕШЕНИЕ

Код:
  $string = '<table border=\'0\'       cellpadding  = "0" cellspacing=0 style= "border-collapse: collapse">';
  if (preg_match_all('#\s+([^=\s]+)\s*=\s*(?(?="|\') (?:"|\')([^"\']+)(?:"|\') | ([^\s]+))#isx', $string, $matches)) {
    print_r($matches);
  }

 
Вот только вопрос как бы результат засунуть в 2 подмаски на не в 3?

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 00:38 23-11-2006 | Исправлено: Delphi6, 00:57 23-11-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6

Цитата:
Вот только вопрос как бы результат засунуть в 2 подмаски на не в 3?

Просто добавь еще одни скобки:

Код:
 
$string = '<table border=\'0\'       cellpadding  = "0" cellspacing=0 style= "border-collapse: collapse">';  
  if (preg_match_all('#\s+([^=\s]+)\s*=\s*((?(?="|\') (?:"|\')([^"\']+)(?:"|\') | ([^\s]+)))#isx', $string, $matches)) {  
    print_r($matches);  
  }  
 

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 11:04 23-11-2006 | Исправлено: sTa1kEr, 11:05 23-11-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Регулярные выражения (RegExp, Regular, eregi, preg)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru