-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

言われているように、正規表現はバランスの取れたテキストを解析するのに非常に悪いため、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 delete first memorized search => span

検索結果全体が配列に取り込まれます。

タグがネストされている場合、これは使用できません。正規表現は機能しません。

サンプル: <div><div>テキスト</div></div>

于 2013-11-14T15:22:24.057 に答える
0

html も処理できるXML::LibXMLのラッパーであるxshを使用します。

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 ;

出力は少し異なります: エンティティの 16 進コードを使用します。

<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' 部分で見つかった文字列です (括弧のおかげで $1 に保存されました。

実際のエンコーディングについて..すべての文字をエンコードする必要がありますか、それとも特別な文字だけをエンコードする必要がありますか? 後者の場合は、次のモジュールを参照することをお勧めします: http://metacpan.org/pod/HTML::Entities。それはまさにそれを行います。

于 2013-11-14T13:27:18.673 に答える