我尝试在Perl中提取[%L10n.msg('
和')%]
之间的文本,因此例如,如果我有类似[%L10n.msg('foo')%]
的代码,我想获取 foo
我为它准备了工作脚本,如您在下面看到的那样,但是它有错误,并且破坏了编码,如您所见。
我想知道该脚本有什么问题以及如何解决。
我的Regexp脚本:
my (@L10n) = $content_from_file =~ /\[\%L10n\.msg\('(.*)'\)\%\]/g;
$ content_from_file:
<div class="detail-trash">
<span class="blog-article-social-net social-net-fb">
<svg class="svg-icon-facebook">
<use xlink:href="[%domain.url_media%]/images/svg-sprite.svg#svg-icon-facebook"></use>
</svg>
[%L10n.msg('Zdielať')%]
</span>
<span class="previews-counter">Počet hodnotení: [%product.rating_votes%]</span>
<a href="#" title="[%L10n.msg('Zobraziť recenzie')%]" class="previews-btn js-previews-btn">[%L10n.msg('Zobraziť recenzie')%]</a>
</div>
当前结果:
Zdiela\x{165}
Zobrazi\x{165} recenzie')%]\" class=\"previews-btn js-previews-btn\">[%L10n.msg('Zobrazi\x{165} recenzie
请求的结果:
Zdielať
Zobraziť recenzie
Zobraziť recenzie
答案 0 :(得分:2)
在正则表达式.*
中是贪婪的。这意味着它将尝试匹配可能的最长字符串。
将其更改为.*?
,以使其不贪婪。然后它将匹配可能的最短字符串。
my @L10n = $content_from_file =~ /\[%L10n\.msg\('(.*?)'\)%\]/g;
答案 1 :(得分:1)
解决匹配问题的最简单方法是,通过在末尾添加.*
,使?
成为正则表达式的非贪婪部分。
您的编码问题更难解决,因为它取决于数据文件的编码以及如何将数据读入文件中。因此,我们将需要更多信息。
此版本对我有用:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my $content_from_file = <<END_OF_TXT;
<div class="detail-trash">
<span class="blog-article-social-net social-net-fb">
<svg class="svg-icon-facebook">
<use xlink:href="[%domain.url_media%]/images/svg-sprite.svg#svg-icon-facebook"></use>
</svg>
[%L10n.msg('Zdielať')%]
</span>
<span class="previews-counter">Počet hodnotení: [%product.rating_votes%]</span>
<a href="#" title="[%L10n.msg('Zobraziť recenzie')%]" class="previews-btn js-previews-btn">[%L10n.msg('Zobraziť recenzie')%]</a>
</div>
END_OF_TXT
my (@L10n) = $content_from_file =~ /\[\%L10n\.msg\('(.*?)'\)\%\]/g;
say Dumper @L10n;
输出:
$VAR1 = 'Zdielať';
$VAR2 = 'Zobraziť recenzie';
$VAR3 = 'Zobraziť recenzie';
答案 2 :(得分:0)
我为您创建了此正则表达式
(?:\[%L10n.msg\(')([A-Za-zť ]+)
它与您需要的内容相匹配,但是如果需要斯洛伐克语字符,可能需要进行调整? 结果在第1组
您可以在这里看看。