0

我正在尝试将正则表达式(包含 1 个变量)与存储为字符串的 HTML 代码页面进行匹配。

HTML 字符串是一个数组,每个元素都包含如下所示的内容。(我已经拆分了某个标签)。数组的每个元素都包含房屋的一些数据(名称、平方米数量等)。当然是虚构的。关键是我需要通过匹配第一个 TD 标签之间的文本来匹配其中的一个,而我需要的部分是表单最后一个 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),我需要的部分是 houseid 37010

我认为这个正则表达式应该可以很好地工作并给我我需要的命中,但是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

I tried your regex with Cerbrus's houses variable and it works fine.
(I added the lazy quantifier ? to [\\s\\S]+, but it works fine without it as well.)

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"

Presumably then, your house variable has the wrong value or houses[i] is not accessing the right string.

于 2013-01-23T22:27:37.873 回答