簡體   English   中英

通過正則表達式按ID獲取元素

[英]Get element by id with regex

我對RegEx有一個快速的問題...

我有一個類似於以下內容的字符串

"This was written by <p id="auth">John Doe</p> today!"

我想做的(使用javascript)基本上是從ID為“ auth”的任何標簽中提取“ John Doe”。

誰能給我一些啟示? 我很抱歉問。

全文:我正在使用XML解析器將數據從提要中傳遞到變量中。 但是,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解析器,因為它在字符串中,而不是文檔中。

無需正則表達式即可執行此操作。 請改用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?

這是一種使瀏覽器為您執行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的使用。

也許像

document.getElementById("auth").innerHTML.replace(/<^[^>]+>/g, '')

可能有用。 所有現代瀏覽器均支持innerHTML。 (如果您不關心從內部內容中刪除HTML位,則可以省略替換。)

如果您可以使用jQuery,請執行

$("#auth").text()

我想做的(使用javascript)基本上是從ID為“ auth”的任何標簽中提取“ John Doe”。

你不能有相同的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);
    }
  }
}

如果標記的內容僅包含文本,則可以使用以下方法:

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");

假設每個字符串僅具有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);

很簡單。 在段落上分割字符串,然后在段落上分割第二部分,結果的第一部分將成為您的值。 每次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM