使用正则表达式获取id的元素

时间:2010-08-04 19:49:44

标签: javascript regex

我有一个关于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解析器,因为它位于字符串中,而不是文档中。

6 个答案:

答案 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);

足够简单。在段落上拆分字符串,然后将段落上的第二部分拆分,结果的第一部分将是您的值。每一次。