1

Javascriptでの正規表現のマッチングに関して非常に具体的な問題があります。私はソースコードの一部、より具体的にはここの一部と一致させようとしています:

<TD WIDTH=100% ALIGN=right><a href="http://forum.tibia.com/forum/?action=main&amp;sectionid=2">World Boards</a> | <a href="http://forum.tibia.com/forum/?action=board&amp;boardid=106121">Olympa - Trade</a> | <b>Bump when Yasir...</b></TD>

私がマッチさせようとしてboardid=106121">Olympa - Trade</a>いる部分は、私が実際に必要としている部分は「オリンパ」です。そこで、次のJSコード行を使用して一致を取得し、「Olympa」を返します。

var world = document.documentElement.innerHTML.match('/boardid=[0-9]+">([A-Z][a-z]+)( - Trade){0,1}<\/a>/i')[1];

この( - Trade)部分は私の問題ではオプションであるため{0,1}、正規表現に含まれています。

また、getElementsByTagNameなどでコードを絞り込む簡単な方法はないため、完全なソースコードを検索することが私の唯一の選択肢です。

これが面白いことです。私は2つのオンライン正規表現マッチャー(そのうちの1つは特にJS-regex用)を使用して、完全なソースコードに対して正規表現をテストしました。どちらの場合も、一致して「オリンパ」を正確に返しました。ただし、Chromeに実際のページにスクリプトを含めると、次のエラーが発生します。

Error in event handler for 'undefined': Cannot read property '1' of null TypeError: Cannot read property '1' of null

明らかに、私の行の最初の部分は一致するものが見つからないため「null」を返し、「null」の[1]を取ることは機能しません。

ソースコードを照合していないのではないかと思いましたが、スクリプトdocument.documentElement.innerHTMLをコンソールに出力すると、完全なソースコードが出力されます。

この正規表現が失敗する理由がわからないので、非常にばかげた何かを見落としているに違いありません。他の誰かが問題を見ていますか?

ケネス、すべての助けに感謝します

4

1 に答える 1

7

正規表現を文字列の中に入れています。文字列の中に入れてはいけません。

var world = document.documentElement.innerHTML.match(/boardid=[0-9]+">([A-Z][a-z]+)( - Trade){0,1}<\/a>/i)[1];

もう1つ、ドキュメントオブジェクトがあるようです。この場合、このHTMLはすべて既に解析されており、壊れやすいホイールを作り直す代わりに、それを利用できます。

var element = document.querySelector('a[href*="boardid="]');
var world = element.textContent;

(これは、<= IE8サポートが必要ないことを前提としています。必要な場合でも、より良い方法が残っています。)

(PS?はの省略形です{0,1}。)

于 2013-01-21T15:30:39.883 に答える