0

文字列として保存されているHTMLコードのページに対して正規表現(1つの変数を含む)を照合しようとしています。

HTML文字列は配列であり、各要素には以下に示すようなものが含まれています。(私は特定のタグで分割しました)。配列の各要素には、家のデータ(名前、平方メートルの量など)が含まれています。もちろん架空のものです。重要なのは、最初のTDタグ間のテキストを照合することで、これらの家の1つだけを照合する必要があり、必要な部分は、フォームの最後のINPUTタグのVALUE(数字)です。

<TR BGCOLOR=#D4C0A1>
 <TD WIDTH=40%><NOBR>Luminous&#160;Arc&#160;2</NOBR></TD>
 <TD WIDTH=10%><NOBR>154&#160;sqm</NOBR></TD>
 <TD WIDTH=10%><NOBR>6460&#160;gold</NOBR></TD>
 <TD WIDTH=40%><NOBR>rented</NOBR></TD>
 <TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
 <FORM ACTION= METHOD=post><TR><TD>
  <INPUT TYPE=hidden NAME=world VALUE=Olympa>
  <INPUT TYPE=hidden NAME=town VALUE="Yalahar">
  <INPUT TYPE=hidden NAME=state VALUE=>
  <INPUT TYPE=hidden NAME=type VALUE=houses>
  <INPUT TYPE=hidden NAME=order VALUE=>
  <INPUT TYPE=hidden NAME=houseid VALUE=37010>
  <INPUT TYPE=image NAME="View" ALT="View" SRC="" BORDER=0 WIDTH=120 HEIGHT=18>
</TD></TR></FORM></TABLE></TD></TR>

次の正規表現を作成しました。

var regex = new RegExp(house + "[\\s\\S]+name=houseid value=([0-9]+)>", "i");

ここhouseで、は家の名前(この例ではLuminous&#160;Arc&#160;2)であり、必要な部分はhouseid37010です。

この正規表現は非常にうまく機能し、必要なヒットを与えるはずだと思いましたが、houses[i].match(regex)毎回nullを返します。文字列に一致するものがありません。

文字列をDOMオブジェクトに変換してTRタグで分割するなど、これまでにいくつかのアプローチを試しました(変換に失敗しました)。身近に感じますが、行き詰まっています。

正規表現が機能しない理由を誰かが理解していますか?

ケネス

4

2 に答える 2

2

文字列をhtmlに(display:nonedivなどで)追加してから、他の場所と同じようにDOMにアクセスできます。

例えば:

<div id="stringContainer"></div>
var searchstring = "Luminous&#160;Arc&#160;2";
searchstring = searchstring.replace(/&#160;/g, '&nbsp;') // Convert &#160; to &nbsp;

var c = document.getElementById("stringContainer");
c.innerHTML = '<table>'+houses+'</table>';
var h = c.getElementsByTagName('tr');

for(var i = 0, l = h.length; i < l; i++){ // Loop through the found elements
    var name = h[i].firstChild.nextSibling.getElementsByTagName('nobr')[0]; // Get the house's name.
    if(name && name.innerHTML == searchstring){ // If the name matches the search string. (innerHTML returns &nbsp; instead of &#160;. hence the replace earlier.)
        console.log(h[i].getElementsByTagName('input')[5].value) // log the value.
    }
}

実例

変数housesが次のようになっていると仮定します。

var houses = '<TR BGCOLOR=#D4C0A1>\n\
<TD WIDTH=40%><NOBR>Luminous&#160;Arc&#160;2</NOBR></TD>\n\
<TD WIDTH=10%><NOBR>154&#160;sqm</NOBR></TD>\n\
<TD WIDTH=10%><NOBR>6460&#160;gold</NOBR></TD>\n\
<TD WIDTH=40%><NOBR>rented</NOBR></TD>\n\
<TD>\n\
    <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>\n\
        <FORM ACTION= METHOD=post>\n\
            <TR>\n\
            <TD>\n\
            <INPUT TYPE=hidden NAME=world VALUE=Olympa>\n\
            <INPUT TYPE=hidden NAME=town VALUE="Yalahar">\n\
            <INPUT TYPE=hidden NAME=state VALUE=>\n\
            <INPUT TYPE=hidden NAME=type VALUE=houses>\n\
            <INPUT TYPE=hidden NAME=order VALUE=>\n\
            <INPUT TYPE=hidden NAME=houseid VALUE=37010>\n\
            <INPUT TYPE=image NAME="View" ALT="View" SRC="" BORDER=0 WIDTH=120 HEIGHT=18>\n\
            </TD>\n\
            </TR>\n\
        </FORM>\n\
    </TABLE>\n\
</TD>\n\
</TR>\n\
<TR BGCOLOR=#D4C0A1>\n\
<TD WIDTH=40%><NOBR>Dark&#160;Arc&#160;2</NOBR></TD>\n\
<TD WIDTH=10%><NOBR>154&#160;sqm</NOBR></TD>\n\
<TD WIDTH=10%><NOBR>6460&#160;gold</NOBR></TD>\n\
<TD WIDTH=40%><NOBR>rented</NOBR></TD>\n\
<TD>\n\
    <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>\n\
        <FORM ACTION= METHOD=post>\n\
            <TR>\n\
            <TD>\n\
            <INPUT TYPE=hidden NAME=world VALUE=Olympa>\n\
            <INPUT TYPE=hidden NAME=town VALUE="Yalahar">\n\
            <INPUT TYPE=hidden NAME=state VALUE=>\n\
            <INPUT TYPE=hidden NAME=type VALUE=houses>\n\
            <INPUT TYPE=hidden NAME=order VALUE=>\n\
            <INPUT TYPE=hidden NAME=houseid VALUE=37010>\n\
            <INPUT TYPE=image NAME="View" ALT="View" SRC="" BORDER=0 WIDTH=120 HEIGHT=18>\n\
            </TD>\n\
            </TR>\n\
        </FORM>\n\
    </TABLE>\n\
</TD>\n\
</TR>';
于 2013-01-23T12:40:21.810 に答える
1

Cerbrusのhouses変数を使用して正規表現を試しましたが、正常に機能します。
(にレイジー数量詞を追加しました?[\\s\\S]+、それがなくても問題なく動作します。)

var house = "Luminous&#160;Arc&#160;2";
var regex = new RegExp( house + "[\\s\\S]+?name=houseid value=([0-9]+)>", "i" );

houses.match( regex )[1];    // "37010"

おそらく、house変数の値が間違っているかhouses[i]、正しい文字列にアクセスしていません。

于 2013-01-23T22:27:37.873 に答える