您好我需要获取$ 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;
答案 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
启用strict
,warnings
和utf8
。 at
方法查找使用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;