这是我想要与RegEx匹配的数据:
<table>
<tr>
<td>
<font size="4">Speciality</font>
</td>
<td>
<font size="4">somespeciality</font>
</td>
</tr>
<tr>
<td>
<font size="4">Date</font>
</td>
<td>
<font size="4">somedate</font>
</td>
</tr>
</table>
我希望得到结果somespeciality
但是使用此RexEx:
/Speciality[\s\S]*size="4">(.*?)<\/font>/i
我得到了somedate
。这样做的正确方法是什么?
感谢。
答案 0 :(得分:1)
您需要在角色等级后使用非 - greedy量词。
[\s\S]*?
答案 1 :(得分:1)
只是为了记录,如果您确实想要使用纯DOM方法执行此操作,您将执行以下操作。它获取所有元素,找到第一个文本内容与文本匹配,获取它的标记名,然后找到具有该标记名称的下一个元素并返回文本内容:
var data = '<table><tr><td><font size="4">Speciality</font></td>' +
'<td><font size="4">somespeciality</font></td></tr>' +
'<tr><td><font size="4">Date</font></td><td><font size="4">' +
'somedate</font></td></tr></table>';
function getSpecial(text, data) {
var div = document.createElement('div');
div.innerHTML = data;
var tagName;
var nodes = div.getElementsByTagName('*');
for (var i=0, iLen=nodes.length; i<iLen; i++) {
if (tagName && nodes[i].tagName == tagName) {
return nodes[i].textContent;
}
if (nodes[i].textContent.trim() == text) {
tagName = nodes[i].tagName;
}
}
}
console.log(getSpecial('Speciality', data)); // somespeciality
任何此类方法(包括使用正则表达式)的困难在于对标记(以及生成的DOM)的任何更改都可能导致进程失败。
请注意,上述内容需要ES5并支持 textContent ,它应该是所有现代浏览器和IE 9+。通过为 trim 添加polyfill并使用nodes[i].textContent || nodes[i].innerText
,可以添加对旧版浏览器的支持。其余的都没事。