不能写regexp

时间:2012-11-14 20:22:11

标签: regex perl

您好我需要获取$ submitkey一个值mjxjezhmgrutgevclt0qtyayiholcdctuxbwb。我的代码出了什么问题?

my $str = '<input type="hidden" value="set" name="fr.posted"></input><input type="hidden" value="mjxjezhmgrutgevclt0qtyayiholcdctuxbwb" name="fr.submitKey"></input><div class="form-actions form-actions__centrate"><button value="clicked" id="hook_FormButton_button_accept_request" onclick="className +=" button-loading"" class="button-pro form-actions__yes" type="submit" name="button_accept_request"><span class="button-pro_tx">Войти</span>';
($submitkey) = $str =~ m/value="(.*?)" name="fr.submitKey"/;
print $submitkey;

4 个答案:

答案 0 :(得分:2)

永远不要使用.*?。这绝不是你真正想做的事情。即使你让它工作,当没有匹配时,它太可能产生极其糟糕的性能。在这种情况下,请使用[^"]*

答案 1 :(得分:1)

.*?不会导致Perl在整个字符串中搜索最短的匹配。因此,.*?之前的文本在字符串中较早匹配,而Perl很高兴它在那里找到匹配项。 .*?只是意味着它与.*?之前的部分匹配的第一个点匹配尽可能少的字符。

正如@ikegami所说:在您的特定情况下使用[^"]*

答案 2 :(得分:1)

您从value的第一个实例一直到"fr.submitKey"进行匹配。

利用每个值都包含在引号内的事实;仅查找非引号字符作为value的一部分。

此外,使用特殊的捕获组变量更简洁:

my $str = '<input type="hidden" value="set" name="fr.posted"></input><input type="hidden" value="mjxjezhmgrutgevclt0qtyayiholcdctuxbwb" name="fr.submitKey"></input><div class="form-actions form-actions__centrate"><button value="clicked" id="hook_FormButton_button_accept_request" onclick="className +=" button-loading"" class="button-pro form-actions__yes" type="submit" name="button_accept_request"><span class="button-pro_tx">Войти</span>';
$str =~ m/value="([^"]*)" name="fr.submitKey"/;
$submitkey = $1;
print $submitkey;

答案 3 :(得分:0)

使用真正的DOM解析器来完成此任务要好得多。我喜欢Mojo::DOM这是Mojolicious工具套件的一部分。请注意use Mojo::Base -strict启用strictwarningsutf8at方法查找使用CSS3选择器匹配的第一个实例。

#!/usr/bin/env perl

use Mojo::Base -strict;
use Mojo::DOM;

my $dom = Mojo::DOM->new(<<'END');
<input type="hidden" value="set" name="fr.posted"></input><input type="hidden" value="mjxjezhmgrutgevclt0qtyayiholcdctuxbwb" name="fr.submitKey"></input><div class="form-actions form-actions__centrate"><button value="clicked" id="hook_FormButton_button_accept_request" onclick="className +=" button-loading"" class="button-pro form-actions__yes" type="submit" name="button_accept_request"><span class="button-pro_tx">Войти</span>
END

my $submit_key = $dom->at('[name="fr.submitKey"]')->{value};
say $submit_key;