Что означают эти регулярные выражения? - PullRequest
1 голос
/ 07 декабря 2011

Я рискну прочитать код на Perl и нашел следующие регулярные выражения:

$str =~ s/(<.+?>)|(&\w+;)/ /gis; 
$str =~ /(\w+)/gis

Интересно, что представляют собой эти коды. Кто-нибудь может мне помочь?

Ответы [ 5 ]

5 голосов
/ 07 декабря 2011

Первый $str =~ s/(<.+?>)|(&\w+;)/ /gis; выполняет подстановку:

$str      : the variable to work on
=~        : do the subs and save in the same variable
s         : substitution operator
 /        : begining or the regex
  (       : begining of captured group 1
   <      : <
   .+?    : one or more of any char NOT greedy
   >      : >
  )       : end of capture group 1
 |        : alternation
  (       : begining of captured group 2
   &      : &
   \w+    : one or more word char ie: [a-zA-Z0-9_]
   ;      : ;
  )       : end of group 2
 /        : end of search part
          : a space
 /        : end of replace part
 gis;     : global, case insensitive, multi-line

Это заменит все теги и закодированный элемент, например &amp; или &lt;, пробелом.

Второйможно ожидать, что осталось хотя бы одно слово.

4 голосов
/ 07 декабря 2011

Первый удаляет каждый тег XML / HTML и каждый символьный объект, заменяя каждый пробелом.Вторая находит каждую подстроку, состоящую полностью из символов слова.

Подробно:

Первая часть первого выражения сначала соответствует <, затем любой символ с . (переводы строки).включается благодаря флажку /s в конце).Модификатор + будет соответствовать одному или нескольким символам вплоть до последнего >, найденного в $str, но ? после этого делает его не жадным, поэтому он соответствует только первому найденному >.Вторая часть соответствует &, за которой следует любой символ слова, пока не будет найден ;.Поскольку ; не является символом слова, модификатор ? не требуется.s/ в начале означает замену, а бит после второй / означает, что заменяется любое совпадение./gis в конце означает * g * reedy, case * i * nsensitive и * s * ingle line.

Второе выражение находит первую подстроку из несловесных символов и помещает ее в $1.Если вы вызываете его несколько раз, /g в конце означает, что он будет соответствовать каждому экземпляру в $str.

4 голосов
/ 07 декабря 2011

Один из способов помочь расшифровывать регулярные выражения - использовать модуль YAPE :: Regex :: Explain из CPAN:

#!/usr/bin/env perl
use YAPE::Regex::Explain;
#...may need to single quote $ARGV[0] for the shell...
print YAPE::Regex::Explain->new( $ARGV[0] )->explain;

Предполагая, что этот фрагмент называется rexplain, вы должны сделать:

$ ./rexplain 's/(<.+?>)|(&\w+;)/ /gis'
3 голосов
/ 07 декабря 2011

Первый принимает строку и заменяет html-теги или html-коды пробелом

Второй гарантирует, что после завершения осталось слово.

0 голосов
/ 07 декабря 2011

Эти "коды" являются регулярными выражениями.Введите это, чтобы узнать больше:

perldoc perlre

Приведенный выше код заменяет пробелами некоторые теги HTML / XML и некоторые символы в кодировке URL, например

 &nbsp; 

из $ str.Но есть лучшие способы сделать это с помощью модулей CPAN.Затем код пытается сопоставить и записать в переменную $ 1 первое слово в $ str.Пример:

perl -le '$str = "foo<br>&nbsp;bar<another\ntag>baz"; print $str; $str =~ s/(<.+?>)|(&\w+;)/ /gis; $str =~ /(\w+)/gis; print $str; print $1;'

Он печатает:

foo<br>&nbsp;bar<another
tag>baz
foo  bar baz
foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...