-1

输入

这个元素周围的一些内容<span class="t39">abcd</span>这个元素周围的一些内容

Hello world <span class="t39">efgh</span>这个元素周围的

一些内容 这个元素周围的一些内容<span class="t39">ijk</span>围绕这个元素的一些内容

输出:

这个元素周围的一些内容<span class="t39">αβγδ</span>这个元素周围的一些内容

Hello world <span class="t39"> 949;φϒη</span>这个元素周围的

一些内容 这个元素周围的一些内容<span class="t39">ιςκ 955;</span>围绕这个元素的一些内容

只有html 元素内的内容才需要进行实体转换

我是 perl 编程的初学者。请指导这个问题。

4

3 回答 3

0

使用xsh,一个围绕XML::LibXML的包装器,它也可以处理 html。

open :F html 1.html ;
for //span[@class="t39"] {
    my $t = text();
    $t = { join q(), map chr(848 + ord), split //, $t } ;
    set . $t ;
}
save :b ;

输出有点不同:它使用实体的十六进制代码:

<html>
<body>Some content around this element <span class="t39">&#x3B1;&#x3B2;&#x3B3;&#x3B4;</span> Some content around this element

Hello world <span class="t39">&#x3B5;&#x3B6;&#x3B7;&#x3B8;</span> Some content around this element

Some content around this element <span class="t39">&#x3B9;&#x3BA;&#x3BB;</span> Some content around this element
</body>
</html>
于 2013-11-14T13:24:52.610 回答
0

好吧,您可能会说,您想对 '>' 和 '<' 之间的内容进行编码(关闭和打开 HTML 括号 - 或者它们被称为的任何东西 :) )。在这种情况下,您可以使用正则表达式,如下所示:

sub do_something {
    my $string = shift;
    return $string." perl is awesome";
}
my $text = "some text <span blabla>my text</span>other text";
$text =~ s/>(.*)</">".do_something($1)."<"/e

使用 =~,您可以将正则表达式“应用”到变量。我在这里使用表单 s/search_this/replace_it_for_this/e 。s/ 表示替代品。>(.*)< 表示查找字符 '>' 和 '<' 之间的任何内容。(更多信息: http: //perldoc.perl.org/perlrequick.html)。

/e 开关允许您在正则表达式中执行 perl 函数。在正则表达式的 'replace_for_this' 部分,我们有 ">".do_something($1)."<" 。它将用字符 > 替换我们找到的字符串,然后是 do_something 函数的返回值,然后是字符 <。do_something 函数的参数中的 $1 是我们在正则表达式的 'search_this' 部分中找到的字符串(由于 parenteses 而保存到 $1 中。

对于实际的编码..您需要对所有字符进行编码,还是只对一些特殊字符进行编码?在后一种情况下,我鼓励你看看这个模块:http ://metacpan.org/pod/HTML::Entities 。它就是这样做的。

于 2013-11-14T13:27:18.673 回答
0

据说,使用 perl 库更好,因为正则表达式对解析平衡文本非常不利

有用的图书馆

HTML::Parser 完整,但对初学者来说并不容易。

HTML::TokeParser::Simple 对于初学者来说非常简单

如果你喜欢一些有趣的正则表达式,你也可以使用下面的代码

my (@res) = grep { !/span/i  } $str =~ m/<(span)[^>]*> #memorize span and find attributes 
                                          (.+?)       #minimum search
                                         <\/\1>       #\1 is for span memorized
                                         /gmixs;

grep 删除第一个记忆的搜索 => 跨度

整个搜索结果被拉入数组。

如果您的标签是嵌套的,则不能使用此功能。正则表达式不起作用。

示例:<div><div>texte</div></div>

于 2013-11-14T15:22:24.057 回答