#regex #perl
#регулярное выражение #perl
Вопрос:
У меня есть переменная my $html
, и она содержит строковое значение. Я хочу вырезать ее после слова
</SELECT>
Как я могу это сделать с помощью Perl?
Ответ №1:
use warnings;
use strict;
my $html = '<SELECT>foo</SELECT> bar';
$html =~ s{(</SELECT>).*}{$1};
print "$htmln";
__END__
<SELECT>foo</SELECT>
Вам также следует рассмотреть возможность использования одного из многих анализаторов HTML в CPAN.
Ответ №2:
$html =~ s#</SELECT>.*$#</SELECT>#;
Вероятно, вы можете написать это без </SELECT>
присутствия в строке замены, но ИМХО это было бы менее читабельно.
Пожалуйста, обратите внимание, что s /// substitution может использовать другие символы помимо /
в качестве разделителей, и в этом случае я решил использовать #
, потому что ваше регулярное выражение содержит символ косой черты, который в противном случае пришлось бы экранировать, что делает регулярное выражение менее читаемым
Комментарии:
1. Если строка $html содержит несколько строк, то приведенное выше регулярное выражение будет соответствовать только
</SELECT>
, если оно находится в первой строке. Вам нужно добавить модификатор ‘s’, чтобы обрабатывать строку как одну строку.s#</SELECT>.*$#</SELECT>#s;
2. @Sam — Я не уверен, имел ли OP в виду независимость от строки или нет … если независимо от строки. вы действительно правы.
Ответ №3:
Не используйте регулярное выражение (электропилу), когда достаточно ножа (ищите фиксированную строку):
my $html = 'use dom to work with </SELECT> html!';
my $cut = '</SELECT>';
printf "|%s|n", substr( $html, index( $html, $cut ) length( $cut ) );
==>
| html!|
Ответ №4:
Если вы хотите получить текст, который стоит перед первым </SELECT>
, вы могли бы использовать регулярное выражение, подобное этому:
$html =~ /(.*?</SELECT>)/;
my $required_text = $1;
или за один шаг:
my ($required_text) = $html =~ /(.*?</SELECT>)/;
Он использует нежадный модификатор ?
, который, я думаю, то, что вам нужно.
Или, лучше, substr()
подпрограмму, как сказано в предыдущем ответе.