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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Perl - Регулярные выражения / Regexpы

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6

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

OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Смежная тема
регулярные выражения в Perl
 
 
Было

Всего записей: 3591 | Зарегистр. 09-07-2002 | Отправлено: 03:52 30-08-2005 | Исправлено: Cheery, 18:37 27-02-2008
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задача: прошерстить текст и заданное слово выделить цветом, т.е. окружить тегами <font color=red>....</font>
Проблема: пропускать заданное слово в средине тегов, тоесть в угловых скобках.
Че-то блин не получается
Нарисовал ниже приведенную конструкцию, но она чего-то не хочет работать
 
$search_word - слово для выделения цветом
$text =~ s/([^<]?.*?)$search_word(.*[^>]?)/$1<font color=red>$search_word<\/font>$2/gi;
 

Всего записей: 3591 | Зарегистр. 09-07-2002 | Отправлено: 02:49 19-07-2006 | Исправлено: OLEX, 02:53 19-07-2006
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Блин, где же монстры рег. выражений?
Неужто все на курортах?

Всего записей: 3591 | Зарегистр. 09-07-2002 | Отправлено: 07:27 21-07-2006
easyman



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

Всего записей: 483 | Зарегистр. 25-10-2002 | Отправлено: 17:50 23-07-2006
Kokoc

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OLEX
так попробуй:

Код:
 
$text =~ s/($search_word)(?=[^>]*?<)?/<font color=red>$search_word<\/font>/gi;
 

 

Всего записей: 793 | Зарегистр. 06-06-2002 | Отправлено: 21:25 23-07-2006 | Исправлено: Kokoc, 21:29 23-07-2006
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kokoc
не работает, вот это:

Код:
$search_word = 'mitsubishi';
$text = "<img src='http://olex/logo_mitsubishi.jpg' width=207 height=66>";
$text =~ s/($search_word)(?=[^>]*?<)?/<font color=red>$search_word<\/font>/gi;
print "$text";
 
 
выдает
 
<img src='http://olex/logo_<font color=red>mitsubishi</font>.jpg' width=207 heig
ht=66>

Всего записей: 3591 | Зарегистр. 09-07-2002 | Отправлено: 23:39 23-07-2006
Delphi6



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

Цитата:
Давайте тут постить вопросы о рег.выражениях

Думаю будет полезны ссылки:
регулярные выражения в Perl
PHP: Регулярные выражения (RegExp, Regular, eregi, preg)
PHP: регулярные выражения (поиск/замена)

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 07:48 24-07-2006 | Исправлено: Delphi6, 07:49 24-07-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OLEX
В перле я не очень силен, но на пхп сделал так:

Код:
 
$search_word = 'mitsubishi';
$text = <<< EOF
<img src='http://olex/logo_mitsubishi.jpg'><b>mitsubishi!</b><br>
mitsubishi - <i id='mitsubishi'>Forever!</i>
<br><br><br>again mitsubishi...
mitsubishi
EOF;
$text = preg_replace("/^(.+>)?([^<]*)($search_word)([^>]*)(<.+)?$/iUm", "$1$2<font color=red>$3</font>$4$5", $text);
print($text);
/* Вывод:
 * <img src='http://olex/logo_mitsubishi.jpg'><b><font color=red>mitsubishi</font>!</b><br>
 * <font color=red>mitsubishi</font> - <i id='mitsubishi'>Forever!</i>
 * <br><br><br>again <font color=red>mitsubishi</font>...
 * <font color=red>mitsubishi</font>
 */
 

На перле, наверное, тоже самое можно сделать, только я не знаю есть ли аналог модификатора U (PCRE_UNGREEDY).

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 11:12 24-07-2006 | Исправлено: sTa1kEr, 11:17 24-07-2006
v7r



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пост может не совсем в тему, но все же...
Задача: из текста сравнительно небольшого объема выдернуть некую подстроку <S>, ограниченную с одной стороны уникальной строкой <S1>, а с другой неуникальной <S2>.
Т.е.
...bla<S2>blabla<S1><S><S2>blabla<S2>blabla...
 
Первое, что пришло в голову - "прочесать" весь текст по строкам на наличие <S1>, а потом из найденной строки "выкусить" подстроку <S>.
 
А как это сделать пооптимальнее? Возможен ли другой, более "изящный" способ?

Всего записей: 148 | Зарегистр. 24-11-2004 | Отправлено: 13:09 24-07-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
v7r
Если речь идет о PHP то есть спец символ, "укратитель жадности" - "?" более детально можете прочитать на сайте php.net.
п.с. ИМХО для вас это будет именно что нужно

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6
Нет, речь идет о Perl. Я не указал это - думал, что будет понятно из названия темы.

Всего записей: 148 | Зарегистр. 24-11-2004 | Отправлено: 15:10 24-07-2006
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sTa1kEr
Строки у меня многострочными не будут стопудово, переписал на перл таким образом, и че-то блин не совсем так:

Код:
$search_word = 'mitsubishi';  
$text = "<i id=mitsubishi>logo_mitsubishi<img src='http://olex/logo_mitsubishi.jpg'><b>mitsubishi!</b>mitsubishi<br>";
 
$text =~ s/^(.+?>)?([^<]*?)($search_word)([^>]*?)(<.+)??$/$1$2<font color=red>$3<\/font>$4$5/ig;
 
 
Помойму этот код заменяет только одно искомое слово в строке
 
ЗЫ. За UNGREEDY в перл отвечает знак вопроса после каждого модификатора который надо сделать "нежадным"

Всего записей: 3591 | Зарегистр. 09-07-2002 | Отправлено: 00:51 25-07-2006 | Исправлено: OLEX, 00:56 25-07-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
v7r
Не думаю что такой главный символ как "укротитель жадности" не учли в perl а учли в РНР? Вот в этой доке показано что в perl этот символ тот же самый
http://www.datamystic.com/textpipe/htmlhelp/general%20usage/perl_regular_expressions.htm
 
Добавлено:
точная копия PHP :

Цитата:
By default, the quantifiers are "greedy", that is, they match as much as possible (up to the maximum number of permitted times), without causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These appear between the sequences /* and */ and within the sequence, individual * and / characters may appear. An attempt to match C comments by applying the pattern
 
  /\*.*\*/
 
to the string
 
  /* first command */  not comment  /* second comment */
 
fails, because it matches the entire string owing to the greediness of the .* item.
 
However, if a quantifier is followed by a question mark, it ceases to be greedy, and instead matches the minimum number of times possible, so the pattern
 
  /\*.*?\*/
 

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 01:23 25-07-2006
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
короче такая конструкция работает
$text =~ s/(.+?>)?([^<]*?)$search_word([^>]*?)(<.+)??/$1$2<font color=red>$search_word<\/font>$3$4/ig;
 
но наверно можно сделать намного проще и короче
 
Спасибо за помощь!
 
Добавлено:
Млин.... все равно толком не работает
если в строке один тег, то в нем слово тоже выделяет
$text = "<img src='http://olex/logo_mitsubishi_heavy.gif'>";
выдает
<img src='http://olex/logo_<font color=red>mitsubishi</font>_heavy.gif'>

Всего записей: 3591 | Зарегистр. 09-07-2002 | Отправлено: 01:57 25-07-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А почему не сделать проще? Вы там начало и конец оформите в стиле perl а я вам само регулярное выражение напишу:
Исх. текст:
...bla<S2>blabla1<S1><S><S2><S1><S2>blabla2<S2>blabla...
 
Рег. выражение:
(<S2>.*?<S1>)
 
Результат:
Array ( [0] => blabla1 [1] => )

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 04:21 25-07-2006
sTa1kEr



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

Цитата:
Строки у меня многострочными не будут стопудово

У меня на пхп без модификатора мультистрок и для одной строки не все слова попадали под шаблон. Т.ч мб. стоит попробовать так:

Код:
 
$text =~ s/^(.+?>)?([^<]*?)($search_word)([^>]*?)(<.+)??$/$1$2<font color=red>$3<\/font>$4$5/igm;  
 

Ну или как вариант

Код:
 
$text =~ s/^(.+>)?([^<]*?)($search_word)([^>]*?)(<.+)?$/$1$2<font color=red>$3<\/font>$4$5/ig;  
 

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 13:08 25-07-2006
Brodyaga



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ничего, если вольюсь в дискуссию со своим спиртОм?
Мне нужно составить регулярное выражение для парсинга SQL запроса.То есть самый примитив, будет дальнейшая обработка.То есть приблизительно:
SELECT (.*) FROM (.*) WHERE (.*) (ORDER BY (.*)|) (LIMIT (\d*),(\d*)|)
Чтобы подходили все SELECT запросы, и в 0-содержалось что выбираем, в 1 содержалось откуда, в 2 содержались условия(если есть!это обязательно) и так далее.
Это все создается для Ruby, но регексы везде одинаковые

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

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 21:30 31-07-2006
Oleg_de



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

Цитата:
Задача: прошерстить текст и заданное слово выделить цветом, т.е. окружить тегами <font color=red>....</font>
Проблема: пропускать заданное слово в средине тегов, тоесть в угловых скобках.
Че-то блин не получается
Нарисовал ниже приведенную конструкцию, но она чего-то не хочет работать
 
$search_word - слово для выделения цветом
$text =~ s/([^<]?.*?)$search_word(.*[^>]?)/$1<font color=red>$search_word<\/font>$2/gi;  

 
 
$search_word - слово для выделения цветом
$text =~ s/\b($search_word)\b/<font color=red>$1<\/font>/igs;  
 
 
Добавлено:

Цитата:
Ничего, если вольюсь в дискуссию со своим спиртОм?
Мне нужно составить регулярное выражение для парсинга SQL запроса.То есть самый примитив, будет дальнейшая обработка.То есть приблизительно:
SELECT (.*) FROM (.*) WHERE (.*) (ORDER BY (.*)|) (LIMIT (\d*),(\d*)|)
Чтобы подходили все SELECT запросы, и в 0-содержалось что выбираем, в 1 содержалось откуда, в 2 содержались условия(если есть!это обязательно) и так далее.
Это все создается для Ruby, но регексы везде одинаковые
 

 
$sql='SELECT *';
if($sql =~ /SELECT\s+(.*?)\s+FROM\s+(.*?)(WHERE|ORDER|$|GROUP)/igs){
  print "SELECT => $1\n";
  print "FROM => $2\n";
   .....   i.t.d.
}

----------
Германия глазами переселенцев и мигрантов ...

Всего записей: 336 | Зарегистр. 03-09-2001 | Отправлено: 12:58 07-08-2006
Brodyaga



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
решение уже найдено, "я попробовал ?: и о чудо!Все пятна отстирались!"


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

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 21:30 07-08-2006
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Brodyaga, если пока есть проблемы с регулярками - почитай perl cookbook, желательно 2-е издание.
Сам недавно взял в бумажном варианте, к электронке лень было часто обращаться, а в бумажном класс


----------
В огне бода нет и не будет!
До встречи в СССР 2.0!

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 21:33 07-08-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6

Компьютерный форум Ru.Board » Интернет » Web-программирование » Perl - Регулярные выражения / Regexpы


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru