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

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

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

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

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

OLEX



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

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



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

Код:
 
$text =~ s#<v:imagedata src="(.*.)" (.*.)\/>#--><img src="$1" alt="" \/><!--#ig;
 

 
для обработки участка в тексте:

Код:
 
<v:imagedata src="./image001.jpg" o:title=""/>
 

 
НО как только в тексте попадается такой участок:

Код:
 
   <v:imagedata src="./image007.jpg" o:title="" gain="79922f"
    blacklevel="-3932f"/>
 

 
то это рег.выр . не работает, не обрабатывает!!  
пробовал 100 раз, оно почему-то не хочет обрабатывать там где обзац стоит!
 
как сделать, чтобы оно работало??

Всего записей: 490 | Зарегистр. 13-05-2009 | Отправлено: 16:23 17-09-2010
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
rtyug,
попробуй, дабы "." работала с мультистроками:

Код:
 
$text =~ s#<v:imagedata src="(.*.)" (.*.)\/>#--><img src="$1" alt="" \/><!--#igs;
 

хотя и само рег. выражение мне, если честно, не сильно нравится.

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

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 16:57 17-09-2010
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rtyug

Цитата:
(.*.)" (.*.)

Это что за порнография?
 
1. Зачем жадные квантификаторы? Оно ж так кучу тегов подряд засосёт.
2. Что значит не обрабатывает? Не лезет на другой абзац? Так ни не должно, читать про смысл символа точки и флаг s.  
3. Зачем лезть регексами в xml, если его можно нормально распарсить?
 

Цитата:
пробовал 100 раз, оно почему-то не хочет обрабатывать там где обзац стоит!  

Китайский метод?


----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 17:03 17-09-2010 | Исправлено: evle, 17:06 17-09-2010
rtyug



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CheRt, добавил модификатор s, теперь вообще не заменяет, не работает...
 
Добавлено:
evle
 

Цитата:
2. Что значит не обрабатывает?  

 
вы видите что идет замена?
...вот замена не работает...
 
 

Цитата:
Китайский метод?

 
оно должно работать, но какого-то не рабоатет, как узнать почему оно не работает...?
вот, напрмиер, в данном случае я добавил модификатор s, как советовали многие, но опять не работает...!!
как узнать почему оно не работает?
...в документации все хорошо написано, но вот на практике, не понятно как узнать почему оно не работает...!
 
 
Добавлено:

Цитата:
Это что за порнография?

ну можно так (.+)
 

Код:
3. Зачем лезть регексами в xml, если его можно нормально распарсить?

тут не обычный XML, а не много с другим стандартом
вот например картинка  так обозначается:

Код:
<v:imagedata  

 
я использую готовый парсер XML, только нужно не нмого подправить регерсами, отформатирвоать текст и т.д.

Всего записей: 490 | Зарегистр. 13-05-2009 | Отправлено: 18:22 17-09-2010 | Исправлено: rtyug, 19:02 17-09-2010
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rtyug
Оно работает в полном соответствии с документацией. В отличие от автора.  
Повторю ещё раз, на всякий случай. Конструкция «(.*.)» абсолютно бессмысленна. «.*» съедает все символы до конца строки, если остаток регулярного выражения «срабатывает». Без ключа s точка не захватывает новую строку.  
Этого достаточно, чтобы найти решение. Я его говорить не буду, поскольку думать всё-таки иногда полезно.
 
Добавлено:

Цитата:
тут не обычный XML, а не много с другим стандартом

То есть парсером тоже пользоваться не умеем. Что ж, печально.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 18:40 17-09-2010
rtyug



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
... в этой теме от тебя нету ниодно ответа, и нету ответа на вопрос, кроме модификатора s
 
этот топик наверное сделнный для флуда и тролиинга...
 
...тогда попробую сам разобратся...  
 
UPD:

Код:
$text =~ s#<v:imagedata src="(.*?)" (.*?)\/>#--><img src="$1" alt="" \/><!--#igs;

Всего записей: 490 | Зарегистр. 13-05-2009 | Отправлено: 19:01 17-09-2010 | Исправлено: rtyug, 21:30 17-09-2010
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кодирую non-ASCII символы в заголовках отправляемого письма, чтобы текст приходил не белибердой в полях FROM, TO, SUBJECT
 

Код:
 
$t = "Hi all я тут по-русски write some текст";
 
use MIME::Base64;
print &check($t);
 
sub check {
    my $c = shift;
    $c =~ s/([^\x00-\x7F]+)/&replace($1)/eg;
    return $c;
} # sub
 
sub replace {
    my $a = shift;
    $a = MIME::Base64::encode($a,"");
    $a = "=?windows-1251?B?".$a."?=";
    return $a;
} # sub
 

 
Норм работает, но обрабатывает отдельно каждое слово, т.е. получаю:
 

Код:
Hi all =?windows-1251?B?/w==?= =?windows-1251?B?8vPy?= =?windows-1251?B?7+4=?=-=?windows-1251?B?8PPx8ero?= write some =?windows-1251?B?8uXq8fI=?=

 
 
Как бы его сделать, чтобы регулярка игнорировала 1 символ между non-ASCII символами, пробел, дефис, etc, чтобы кодировалось не отдельно каждое слово, а фразы.
 
Спасибо!

----------
Отче Наш, иже еси в моем PC. Да святится имя и расширение Твоё. ENTER.

Всего записей: 3590 | Зарегистр. 09-07-2002 | Отправлено: 22:27 23-02-2013
CheRt



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

Цитата:
Как бы его сделать, чтобы регулярка игнорировала 1 символ между non-ASCII символами, пробел, дефис, etc, чтобы кодировалось не отдельно каждое слово, а фразы.

Что-то навроде?

Код:
 
sub check {  
     my $c = shift;  
     $c =~ s/(?:[^\x00-\x7F]+[\s\t\-]*)+/&replace($1)/eg;  
     return $c;  
} # sub  
 


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

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 02:33 24-02-2013
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CheRt
так ниче не ловит, на выходе
 

Код:
Hi all =?windows-1251?B??=write some =?windows-1251?B??=

Всего записей: 3590 | Зарегистр. 09-07-2002 | Отправлено: 05:56 24-02-2013
OLEX



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

Код:
$c =~ s/((?:[^\x00-\x7F]+[\s-]?)+)/&replace($1)/eg;

 
Спасибо!

Всего записей: 3590 | Зарегистр. 09-07-2002 | Отправлено: 10:51 24-02-2013
Karabas_il

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А можно и мне спросить кой чАво ?
Нужно вырезать скобку (да не важно, просто единичный символ)
 
 $string=~s/\}//g;  
 $string=~s/}//g;
 $string=~s/\u007D//g;
 
.... ни чего не работает.
Подозреваю, что проблема кроется в странной конфигурации сервера :
Win2008
IIS7
ActivePerl
всё написано в UTF-8
 
Чёт я в тупике....

Всего записей: 45 | Зарегистр. 04-05-2006 | Отправлено: 11:36 13-11-2013
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Karabas_il, работает только средний вариант. И в cp1251 и в utf-8.  
$string откуда берется?
А без сервера пробовал скрипт запустить?

Всего записей: 3590 | Зарегистр. 09-07-2002 | Отправлено: 13:09 13-11-2013
Karabas_il

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OLEX
Спасибо за помощь, но я нашёл решение, правда его не понял....
Вот весь кусок кода :
 
 
 
Добавлено:
Данные идут из POST  и есть use UTF-8;
Код :
 
$string=~tr/+/ /;
$string=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;  
$string=~s/[&#{}";`]//g;
 
Если поставить последнюю строку в начале - то не работает.
А в конце  - работает.
Что делает средняя строка представляю слабо - взял откуда-то очень давно....  
.... тоже проверяет, но там ещё что-то с перекодировкой наверное.....
 
В тоже время первая строка с заменой плюса на пробел - работает, а вот если менять скобку, на пробел или просто вырезать, то не работает....

Всего записей: 45 | Зарегистр. 04-05-2006 | Отправлено: 13:44 13-11-2013
tolyn77



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
всем привет
 
не подскажете что не нравится в этой строке  
if ( $mac =~ m/$hash{$key}/ ) {
 
выдает ошибку
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at snmp7.pl line 83
 
заранее благодарен

Всего записей: 1498 | Зарегистр. 07-09-2004 | Отправлено: 07:49 21-05-2014 | Исправлено: tolyn77, 10:52 21-05-2014
Cheery



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

Цитата:
не нравиться

не нравится
 

Цитата:
выдает ошибку  

значит содержимое строки содержит то, что является часть регулярного выражения.
в данном случае она начинается с *, что приводит к ошибке.
 
нужно экранировать содержимое
 $mac =~ m/\Q$hash{$key}\E/


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 07:57 21-05-2014
tolyn77



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
1. исправил
2. спасибо

Всего записей: 1498 | Зарегистр. 07-09-2004 | Отправлено: 10:53 21-05-2014
tolyn77



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
всем привет
подскажите как извлечь из $_ (

Код:
 
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'><System><Provider Name='Microsoft-Windows-PrintService' Guid='{747EF6FD-E535-4D16-B510-42C90F6873A1}'/><EventID>801</EventID><Version>0</Version><Level>4</Level><Task>43</Task><Opcode>0</Opcode><Keywords>0x4004000000000000</Keywords><TimeCreated SystemTime='2015-11-02T10:41:18.570383600Z'/><EventRecordID>340346</EventRecordID><Correlation/><Execution ProcessID='1464' ThreadID='3828'/><Channel>Microsoft-Windows-PrintService/Operational</Channel><Computer>server</Computer><Security UserID='S-1-5-18'/></System><UserData><JobDiag xmlns:auto-ns3='http://schemas.microsoft.com/win/2004/08/events' xmlns='http://manifests.microsoft.com/win/2005/08/windows/printing/spooler/core/events'><JobId>152</JobId><Copies>1</Copies></JobDiag></UserData></Event>
 

) значения, например этих элементов?
<JobId>123</JobId>
<Copies>1</Copies>
 
заранее благодарен
ПС пытюсь как то так
$id =~ s/\<JobId\>(\d*)\<\/JobId\>/$1/ig;
но что то ничего не выходит
так тоже не получается
$id = $_ =~ s/\.*\<JobId\>(\d*)\<\/JobId\>\.*/$1/ig;

Всего записей: 1498 | Зарегистр. 07-09-2004 | Отправлено: 11:13 19-11-2015 | Исправлено: tolyn77, 13:03 19-11-2015
CheRt



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

Цитата:
$id = $_ =~ s/\.*\<JobId\>(\d*)\<\/JobId\>\.*/$1/ig;  

1. Достаточно поиска, замена тут ни к чему.
2. Поиск возвращает список, потому присваивать результат надо тоже списку. Например, убрав скаляр в скобки - сделав список с 1 элементом.

Код:
my ($id) = $_ =~ m/<JobId>(\d*)<\/JobId>/i;


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

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 01:20 28-11-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 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