2011-12-27 9 views
2

私は困惑しています!私はGoogleで検索して読んで読んで読んで、私は私が間違ってやって本当にばか何かがあると確信していました。これはGreasemonkeyスクリプトからのもので、私の人生は始動して正しく実行することができません。私はこれに一致するようにしようとしている:リンクテキストを取得するための正規表現

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

を私はエスケープ文字のいくつかの種類を欠けていると確信している:

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

はここで私が使用している何ですか?しかし、私はそれを理解することができないので、Firefoxはエラーになりません。代わりに、リテラル正規表現の文字列から正規表現を構築する場合

/href=\".*?\">(.*?)\(/ 
+5

ます。http:// stackoverflowの。com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – asawyer

+0

私は常にリテラル正規表現を好んでいます。 ''これは文字列 ".match(/ match me/i)' – tomfumb

+0

です。このようなことを達成するためにXMLパーサを使用する方法についてもっと知りたいと思っています。私は基本的に、既存のスクリプトを修正して、必要なものを達成しようとしています。このような** ** **方法を行うgreasemonkeyスクリプトの良い例はありますか? – spazzed

答えて

4

: -

私はhttp://regexpal.com/を使用して正規表現を生成するFirefoxのエラーコンソールでは、私は、「終端されていないの括弧」を受信

+0

これは完全に機能するようです。私はまだ混乱しています - 文字列の最初の引用符は単一のバックスラッシュを必要としますが、最後の "("は二重を必要とします?)理由は何ですか? – spazzed

+1

'' "' "は引用符をエスケープして文字列で使用します\\は\\をエスケープして正規表現で使用できるようにします。 '\('(キャプチャグループを開くのではなく文字通り '(')にマッチするように括弧をエスケープします。 –

+0

文字列がエスケープされるので、JavaScriptはそれを文字列リテラル内の引用符として解釈します。正規表現は引用符を受け入れることができますので、正規表現内でエスケープする必要はありません。正規表現内では文字列ではないので、 "\\("、しかしJavaScriptはバックスラッシュ文字を含むので、文字列に "\\\"( "javascriptは" "\\("と正規表現へのフィードを含む文字列。 –

1

は、ここで簡単な修正ですバックスラッシュを倍にする必要があります。

次に、\d*は数字にのみ一致します。私はSOMETHINGが単なるプレースホルダであると仮定していますが、数字以外のものが含まれていれば失敗します。

また、(.*)(欲張り)の代わりに(.*?)(怠惰)を使用する必要があります。あまりにも多く一致する可能性があります。おそらく([^(]*)がさらに良いでしょう。

あなたが実際に試しているテキストについて詳しく知りません。

すべてのすべて:

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

一般的な考え方は、その情報を抽出するために、それを横断し、HTMLの文字列を取る文書(dom elementsの木)にそれを解析することです。

リンクだった場合:

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

まずその後、アンカータグを見つけるためにツリーをトラバース:

anchor.textContent // returns "something else" 

ある場合でも、要素からテキストを抽出することは簡単ですその下のツリーの他の要素にもテキストが含まれています。これは正規表現の例よりも堅牢です。誰かがクラス属性をアンカーに追加したとすると、受け入れられた答えの正規表現はアンカータグに一致しなくなります。しかし、トラバーサルベースのソリューションはまだ動作します。単純なケースで

、あなたはDIVを作成することができ、それを横断した後、あなたのHTML文字列にinnerHTMLを設定します。この

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

関連する問題