我有一个关于RegEx的快速问题......
我的字符串类似于以下内容:
"This was written by <p id="auth">John Doe</p> today!"
我想做的事(使用javascript)基本上是从ID为“auth”的任何标签中提取出来的'John Doe'。
有人可以解决一些问题吗?对不起,我很抱歉。
全文: 我正在使用XML解析器将数据传递到feed中的变量。但是,XML文档()中有一个标记包含传递给字符串的HTML。它看起来像这样:
<item>
<title>This is a title</title>
<description>
"By <p id="auth">John Doe</p> text text text... so on"
</description>
</item>
正如您所看到的,我不能对该p标记使用HTML / XML解析器,因为它位于字符串中,而不是文档中。
答案 0 :(得分:2)
不需要正则表达式来执行此操作。改为使用DOM。
var obj = document.getElementById('auth');
if (obj)
{
alert(obj.innerHTML);
}
顺便说一下,在同一页面中具有相同值的倍数id
是无效的(并且肯定会导致奇怪的JS行为)。
如果您希望同一页面上有多个auth
,请使用class
代替id
。然后你可以使用类似的东西:
//IIRC getElementsByClassName is new in FF3 you might consider using JQuery to do so in a more "portable" way but you get the idea...
var objs = document.getElementsByClassName('auth');
if (objs)
{
for (var i = 0; i < objs.length; i++)
alert(obj[i].innerHTML);
}
编辑:由于您要解析包含某些HTML的字符串,因此您将无法使用我的答案as-iis。您的HTML字符串是否包含完整的HTML文档?有些部分?有效的HTML?部分(破碎)HTML?
答案 1 :(得分:2)
这是让浏览器为您进行HTML解析的一种方法:
var string = "This was written by <p id=\"auth\">John Doe</p> today!";
var div = document.createElement("div");
div.innerHTML = string; // get the browser to parse the html
var children = div.getElementsByTagName("*");
for (var i = 0; i < children.length; i++)
{
if (children[i].id == "auth")
{
alert(children[i].textContent);
}
}
如果您使用类似jQuery的库,则可以隐藏for循环并将textContent
替换为跨浏览器使用。
答案 2 :(得分:0)
也许像
document.getElementById("auth").innerHTML.replace(/<^[^>]+>/g, '')
可能会奏效。所有现代浏览器都支持innerHTML。 (如果您不关心从内部内容中删除HTML位,则可以省略替换。)
如果您有jQuery,请执行
$("#auth").text()
答案 3 :(得分:0)
我想做什么(使用javascript)是 基本上提取'John Doe' 来自任何ID为“auth”的标签。
对于多个元素,您不能拥有相同的 id (auth
)。每页每个元素应分配一次id。
但是,如果您为元素分配了一个auth
类,那么假设我们正在处理段落元素,您可以这样做:
// find all paragraphs
var elms = document.getElementsByTagName('p');
for(var i = 0; i < elms.length; i++)
{
// find elements with class auth
if (elms[i].getAttribute('class') === 'auth') {
var el = elms[i];
// see if any paragraph contains the string
if (el.innerHTML.indexOf('John Doe') != -1) {
alert('Found ' + el.innerHTML);
}
}
}
答案 4 :(得分:0)
如果标签的内容仅包含文字,您可以使用:
function getText (htmlStr, id) {
return new RegExp ("<[^>]+\\sid\\s*=\\s*([\"'])"
+ id
+ "\\1[^>]*>([^<]*)<"
).exec (htmlStr) [2];
}
var htmlStr = "This was written by <p id=\"auth\">John Doe</p> today!";
var id = "auth";
var text = getText (htmlStr, id);
alert (text === "John Doe");
答案 5 :(得分:0)
假设每个字符串只有1 auth
,你可能会这样:
var str = "This was written by <p id=\"auth\">John Doe</p> today!",
p = str.split('<p id="auth">'),
q = p[1].split('</p>'),
a = q[0];
alert(a);
足够简单。在段落上拆分字符串,然后将段落上的第二部分拆分,结果的第一部分将是您的值。每一次。