2011-12-27 112 views
2

我很難過!我GOOGLE了一讀,閱讀和閱讀,我敢肯定,有什麼真的愚蠢,我做錯了。這是來自Greasemonkey腳本,我不能在我的生活中啓動並正確執行。我想匹配此:正則表達式來獲取鏈接文本

<a href="/browse/post/SOMETHING/">**SOMETHING** (1111)</a> 

以下是我正在使用的是什麼:

var titleRegex = new RegExp("<a href=\"/browse/post/\d*/\">(.*) \("); 

我敢肯定,我錯過了某種轉義字符?但我無法弄清楚,所以Firefox不會出錯。

我生成使用http://regexpal.com/正則表達式 - 「未終止的括號」

+5

的http://計算器。COM /問題/ 1732348 /正則表達式匹配開放標籤,除了-XHTML-自足標籤/ 1732454#1732454 – asawyer 2011-12-27 21:38:18

+0

爲了便於閱讀,我總是喜歡文字的正則表達式,如'「這是一個字符串」.match(/ match me/i)' – tomfumb 2011-12-27 21:48:43

+0

我很想知道如何使用XML解析器來完成這樣的事情。我基本上試圖修改一個現有的腳本來完成我需要它做的事情 - 你有一個很好的例子,可以用這種** right **方式來做一些事情嗎? – spazzed 2011-12-27 22:03:56

回答

4

當建立從一個字符串,而不是字面正則表達式正則表達式,你需要加倍反斜槓。

然後,\d*只匹配數字。我假設SOMETHING只是一個佔位符,但如果它包含除數字以外的任何內容,則會失敗。

此外,您應該使用(.*?)(懶惰)而不是(.*)(貪婪),或者您可能會匹配太多。也許([^(]*)會更好。

很難說,但不知道更多關於您試圖匹配的實際文本。

總而言之:

var titleRegex = new RegExp("<a href=\"/browse/post/\\d*/\">([^(]*) \\("); 
+0

這似乎很好地工作。我仍然困惑 - 字符串中的第一個引號只需要一個反斜槓但「(」末需要雙,這是什麼原因 – spazzed 2011-12-27 21:58:52

+1

'\「'轉義引號字符,所以你可以?在字符串中使用它。\\轉義反斜槓,所以你可以在一個正則表達式,其中'\('轉義括號,因此在文字上的'(',而不是打開一個捕獲組。 – 2011-12-27 22:05:19

+0

因爲在第一個引號匹配使用字符串逃過這樣的JavaScript解釋爲字符串文字中的引號。正則表達式是樂於接受引號,所以它並不需要在正則表達式中逃了出來。在「(」末需要轉義正則表達式,而不是字符串中,所以你需要的JavaScript字符串包含「\\(」,但JavaScript的吃一個反斜槓字符,所以得到的字符串包含您需要「\\\(」它的JavaScript變成了包含「\\(」並提供給正則表達式的字符串 – 2011-12-27 22:06:17

1

這裏有一個簡單的解決在Firefox錯誤控制檯我得到:

/href=\".*?\">(.*?)\(/ 
2

的總體思路是把HTML的字符串,它解析爲一個文件(的dom elements樹),然後遍歷它來提取信息。

如果該鏈接爲:

<a href="/browse/post/something/"><b>something</b> else</a> 

首先遍歷樹找到錨標記,則:

anchor.textContent // returns "something else" 

它是簡單的提取的元素中的文本,即使有下面的樹中還包含文本的其他元素。這也比正則表達式更強大。假設有人向錨點添加了類屬性,則接受的答案中的正則表達式將不再與錨點標記匹配。但基於遍歷的解決方案仍然可行。

在簡單情況下,你可以創建一個div,然後設置innerHTML你的HTML字符串,然後遍歷它:

var html = '<p><a href="/browse/post/">Lorem</p> <p>Ipsum</p></a>'; 
var div = document.createElement("div"); 
div.innerHTML = html; 
var anchors = div.getElementsByTagName("a"); 
for (var i = 0; i < anchors.length; i++) { 
    console.log(anchors[i].textContent); 
} 

這方面的一個更復雜的版本被打包在jQuery(string) function

var html = '<div><p><a href="/browse/post/">Lorem</p> <p>Ipsum</p></a></div>'; 
jQuery(html).find("a").each(function() { 
    console.log(jQuery(this).text()); 
}); 

活生生的例子:http://jsfiddle.net/ygcFM/

+0

很好的迴應。我有時間拿起一本關於jQuery和DOM的書來嘗試學習這些東西。我的JavaScript充其量是「新手」。此外 - 雙感謝jsfiddle.net鏈接!我以前沒有見過......偉大的工具! – spazzed 2011-12-29 20:36:34