我希望从多行文字中找出一些好吃的东西。我很喜欢在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">>>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);
答案 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">>>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">>>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;