2012-04-04 126 views
2

我期待從多行文本字符串中挖掘出一些好東西。我很喜歡在Perl中使用正則表達式(雖然我確信有比下面的代碼更好的方法),但是並不真正瞭解如何在正則表達式中使用標記字符串作爲Javascript中newSubStr的一部分。有沒有辦法,或者我堅持在它上面運行多個替換以消除音頻和源代碼行?在(我有限的)投票需要幫助將Perl正則表達式轉換爲Javascript正則表達式

$_ = <<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"; 

倍數的正則表達式可能是這樣的:

// 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

你想做什麼?你是否擁有一堆HTML文件,或者你想在瀏覽器中執行此操作?你爲什麼在這裏使用JavaScript?你試過什麼了? – 2012-04-04 17:47:29

+1

用正則表達式解析html不是一個好主意。 – kirilloid 2012-04-04 17:47:29

+0

@briandfoy我只是試圖(基本上)摧毀一個音頻標籤,用它的內部文本替換它。我這樣做,當我發現瀏覽器支持音頻標籤,但沒有可用的來源。看到我的相關問題在[http://stackoverflow.com/q/10016079/1311457] – SidMuchRock 2012-04-04 18:02:13

回答

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; 
+0

嗯是的,爲什麼我沒有想到這一點。正如你注意到的那樣,這更安全。我會給你一槍,然後回來。 – SidMuchRock 2012-04-04 21:07:37

+0

完美地工作。它並沒有回答我上面的問題,但它首先回答了我不得不問這個問題的需要。無論如何,我們都會給它打電話。 :) 謝謝! – SidMuchRock 2012-04-04 22:38:37

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。在我看來,應該在音頻內部生成其他內容,並且應該能夠在這種情況下爲您提供一些您喜歡的內容。我會支持一下並努力解決這個問題。或者,你可以解釋更多關於你的問題。

+0

我不想要爲每個用戶從頭開始構建html(.shtml或其他一些解決方案),我已經設置了頁面,我只是想根據用戶的偏好或能力進行修改。我可以用幾行正則表達式輕鬆完成。我可以很容易地用兩個for循環和一些變量來讓我知道,如果我們在我想要存儲的部分。但我希望能像PERL那樣能夠做到這一點。不用擔心,我有工作。 – SidMuchRock 2012-04-04 18:47:29

+0

@SidMuchRock - FYI,語言的名稱是Perl,解釋器的名稱是'perl'。 – 2012-04-04 20:55:06

+0

爲什麼要爲每個用戶構建HTML?根據你對問題的描述,這聽起來像一些文件鏈接到不存在的資源。只是不要生成鏈接到這些缺少的文件。 – 2012-04-04 23:15:58