Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > обойти абзац


Автор: gcc 17.9.2010, 02:41
есть регулярнео выражение для замены, точнее для обработки картинок:
Код
$text =~ s#<v:imagedata src="(.*.)" (.*.)\/>#--><img src="$1" alt="" \/><!--#ig;


есть участок текста, где данное рег. выр. не работает, по причине что стоит абзац...!!
Код
   <v:imagedata src="./RGDMETMP1.files/image011.jpg" o:title="" gain="1.5625"
    blacklevel="-5898f"/>


тут есть много текста, по этому просто удалить обзац не получится...!

как тут написать это рег.выр. чтобы была замена, как обойти обзац (перенос строки) ??

я пробовал так: 
Код
$text =~ s#<v:imagedata src="(.*.)" (.*.)\/>#--><img src="$1" alt="" \/><!--#gsxie;


но отвичет:
Код
/per.pl > 11
syntax error at ./per.pl line 30, near "-->"
Execution of ./per.pl aborted due to compilation errors.


что с этим делать я не понял...

Автор: ming 17.9.2010, 07:57
модификатор /e предписывает движку регэкспов выполнить код, указанный в кач-ве второго аргумента оператора s///
Но строка
Код

--><img src="$1" alt="" \/><!--

валидным perl-кодом не является, 
поэтому либо убирайте /e, либо заключайте в аргумент в кавычки
Код

"--><img src=\"" . $1 . "\" alt=\"\" \/><!--"


/x тоже лишний, т.к. рег выражение может быть записано в одну строку и без использования разделительных пробельных символов

В вашем случае нужно было всего лишь прибавить модификатор /s smile

PS:  Подозреваю, что (.*.)  можно заменить на (.+) ... или что это за конструкция такая? 

Автор: gcc 17.9.2010, 14:28
не со всем понял, что-то...

есть регулряное выражение:
Код

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


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

<v:imagedata src="./RGDMETMP1.files/image001.jpg" o:title=""/>


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

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


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

как сделать, чтобы оно работало?? 

Автор: ming 17.9.2010, 17:09
Код

$text =~ s#<v:imagedata src="(.*.)" (.*.)\/>#--><img src="$1" alt="" \/><!--#igs;      # << модификатор s

Автор: gcc 17.9.2010, 17:21
ming, добавил модификатор s, теперь вообще не заменяет, не работает...

Автор: ming 17.9.2010, 20:17
а всё, разобрался. тут виноваты жадные квантификаторы 
вот тут (src="(.*.)") захватывается не 
Код

./RGDMETMP1.files/image007.jpg  

как вы надеялись, а 
Код

./RGDMETMP1.files/image007.jpg" o:title="" gain="79922f"    blacklevel="-3932f


вот так у меня заработало ( .*  ->  .*? ):
Код

my $text = <<"TEXT";
<v:imagedata src="./RGDMETMP1.files/image001.jpg" o:title=""/>

<v:imagedata src="./RGDMETMP1.files/image007.jpg" o:title="" gain="79922f"
    blacklevel="-3932f"/>
TEXT

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

print $text;



Автор: gcc 17.9.2010, 20:32
понятно, у меня как раз не давно такая же проблема была, я забыл что они не работают нормально..

Автор: Logo 17.9.2010, 23:22
Все работает нормально, разберитесь просто.

Автор: gcc 1.10.2010, 08:35
подскажите, почему такое рег. выр.

Код

$text =~ s#<img width=(.*?) height=(.*?) src="(.*?\/)([a-z0-9\.]+)" (.*?)\/>#<img src="$patch_pic_site$rand_img-$4" alt="" \/>#igs;


не хочет работать для такого участка 
Код

<img width=236 height=149
  src="./RGDMETMP1.files/image010.jpg" align=left hspace=12 v:shapes="_x0000_s1049">

в тексте?



Автор: Logo 1.10.2010, 09:39
В реге />, в тексте >. [a-z0-9\.]+ сдесь не разрешен обратый слеш, а в тексте он есть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)