需要帮助将Perl正则表达式转换为Javascript正则表达式

时间:2012-04-04 17:37:43

标签: javascript regex perl

我希望从多行文字中找出一些好吃的东西。我很喜欢在Perl中使用正则表达式(尽管我确信有比我下面的代码更好的方法),但是我真的没有看到如何在regexp中使用标记字符串作为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";

Multiples正则表达式(我的有限)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);

2 个答案:

答案 0 :(得分: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>

还有其他Perl模块可以正确解析HTML并使用该结构。

对于JavaScript方面,为什么不直接替换HTML?我知道你问a related question about this。在我看来,其他东西应该在音频内部产生内容,并且在这种情况下应该能够给你一些你喜欢的东西。我会支持一步并继续努力。或者,您可以解释有关您的问题的更多信息。

答案 1 :(得分: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;