2

複数行のテキスト文字列からいくつかのグッズを探しています。Perl で正規表現を行うのは快適ですが (ただし、以下のコードよりも優れた方法があると確信しています)、Javascript の newSubStr の一部として正規表現でマークされた文字列を使用する方法が実際にはわかりません。オーディオとソース行を捨てる方法はありますか、またはこれで複数の置換を実行して立ち往生していますか?

$_ = <<END;
<audio controls="controls" preload="metadata">
   <source src="01.mp3" type="audio/mpeg">
   <source src="01.ogg" type="audio/ogg">
   Stuff
   Default: <a href="01.mp3">&gt;&gt;download</a>
</audio>
END

s#.*<source.*?>.*?\n(.*)\n</audio>.*#$1#s;

print "[$_]\n";

(私の限られた)Javascriptの複数の正規表現は次のようになります:

// We're really dependent on the HTML layout for line feeds
// so watch out.
var line = aElems[i].innerHTML.replace(/.*?audio.*?\n/gm, '');
var line2 = line.replace(/.*<source.*?\n/mg, '');
console.log(line2);
4

2 に答える 2

3

あなたは JavaScript を使いたいと言っていますが、正規表現を使わない Perl のアプローチを紹介したいと思います。HTML::TokeParser::Simpleを使用すると、かなり簡単になります。

use HTML::TokeParser::Simple;
my $p = HTML::TokeParser::Simple->new( *DATA );

TOKEN: while( my $token = $p->get_token ) {
    if( $token->is_start_tag( 'audio' ) ){
        AUDIO: while( my $t = $p->get_token ) {
            next AUDIO if $t->is_tag( 'source' );
            last AUDIO if $t->is_end_tag( 'audio' );
            print $t->as_is;
            }
        next TOKEN;
        }

    print $token->as_is;
    }

__DATA__
<html>
<head><title>Test</title></head>
<body>
<p>Keep this</p>
<audio controls="controls" preload="metadata">
   <source src="01.mp3" type="audio/mpeg">
   <source src="01.ogg" type="audio/ogg">
   Stuff
   Default: <a href="01.mp3">&gt;&gt;download</a>
</audio>
<p>Keep this</p>
</body>
</html>

これは与える:

<html>
<head><title>Test</title></head>
<body>
<p>Keep this</p>



   Stuff
   Default: <a href="01.mp3">&gt;&gt;download</a>

<p>Keep this</p>
</body>
</html>

HTML を正しく解析し、構造を操作する Perl モジュールは他にもあります。

JavaScript 側については、HTML だけを置き換えてみませんか? これについて関連する質問をしたことは知っています。この場合、何か他のものがオーディオ内のコンテンツを生成し、あなたが好きなものを提供できるはずだと私には思えます。私はステップをバックアップしてそれに取り組みます。または、問題についてもっと詳しく説明することもできます。

于 2012-04-04T18:03:55.737 に答える
2

両方の質問を読むと、オーディオタグの親タグに、ソース要素を削除したオーディオタグの innerHTML を含めることが本当に必要なように思えます。

正規表現は、DOM を使用してより少ない労力で同じ結果を得ることができる場合は特に、エラーが発生しやすくなります。

var audio_tag = ...;
var elements_to_delete = audio_tag.getElementsByTagName('source');
for (var idx = elements_to_delete.length - 1; idx >= 0; --idx) {
    audio_tag.removeChild( elements_to_delete[idx] );
}
audio_tag.parentNode.innerHTML = audio_tag.innerHTML;
于 2012-04-04T19:46:04.347 に答える