1

在过去的几天里,我一直在尝试这样做,但我的 Javascript 是可怕的。极其。

基本上,我试图完成的是获取 td 中的值,并检查一串 10 位数字。(实际上,任何美国格式的电话号码。我已经想出了正则表达式。)我需要用其他东西(不是电话号码的东西)替换那个字符串。

表结构如下所示:

    <tr id="76">
        <td class="stxt">
            <div class="dtxt" id="t1344992123" title="14 Aug 12, 08:55 PM">17 mins ago</div>
            <span>
                <a title="Delete">[×]</a>&nbsp;
                <a title="Ban User">[o]</a>&nbsp;
            </span>
            <b class="nme pn_std">Person</b>
            : This is a line a user has said previously
        </td>
    </tr>

将有几行都具有相同的格式。它说“:这是用户之前说过的一行”是需要检查数字的地方。

我发布的表格格式是我必须使用的。无法添加,也无法删除任何标签/属性。

如果有人能够提出用于检查和替换我正在搜索的每个实例的代码,我可以自己插入正则表达式和替换字符串。

而且,如果有人好奇,这是用于 cbox 聊天的单词过滤器。它只是在有人加载聊天时运行的东西。

任何能帮助我的人都会很棒。就像我说的,我不擅长 Javascript。PHP 是我使用的语言。

4

2 回答 2

2

如果您不支持 IE8 以下的任何内容,则可以使用更新的 querySelectorAll。但在发表评论后,我想我会评论它以支持旧方法。

//var tableCells = document.querySelectorAll('#tableId td'),
var tableCells = document.getElementsById('tableId').getElementsByTagName('td'),
i = tableCells.length;

while(i--){
    var thisCell = tableCells[i];
    thisCell.innerHTML = thisCell.innerHTML.replace(yourRegEx,yourReplacementStuff);
}

在有人讨论 regEx 和 HTML 之前,请记住,他只是在这里寻找电话号码,而不是用 regEx 解析 HTML。您可以在整个表格的 innerHTML 属性上使用 regEx,但我怀疑循环和咬掉较小的部分实际上可能更快。

于 2012-08-15T02:33:45.943 回答
0

如果您无法唯一标识要替换其文本的元素,则需要遍历所有文本节点并将其替换为与正则表达式匹配的文本(您尚未向我们展示)。

function processTable(id) {
  var table = document.getElementById(id);
  var cells;
  var re = /\d{10}/; // just an example
  var text = 'foo';  // just an example

  if (table) {

    // Could iterate over table.rows then row.cells,
    // but gEBTN seems suitable
    cells = table.getElementsByTagName('td');

    for (var i=0, iLen=cells.length; i < iLen; i++) {
      replaceText(cells[i], re, text);
    }
  }
}

// Recursively replace text in text nodes of elements
function replaceText(el, re, text) {

  var node, nodes = el.childNodes;

  for (var i=0, iLen=nodes.length; i < iLen; i++) {
    node = nodes[i];

    // Replace content of text nodes
    // Ignore script elements
    if (node.nodeType == 3 && node.tagName.toLowerCase() != 'script') {
      node.data = node.data.replace(re, text);

    // Recurse over elements to get child text nodes
    } else if (node.childNodes) {
      replaceText(node, re, text);
    }
  }
}

一些 HTML 来测试它:

<table id="t0">
  <tr>
    <td>1234567890
    <td><span>1234567890</span>
  <tr>
    <td>foo 1234567890 bar
    <td><span><b>1234567890</b></span>
  <tr>
    <td><a href="http://www.google.com">1234567890</a>
    <td><span>1234567890</span>
<table>

<button onclick="processTable('t0')">Do replacements</button>

以上应该适用于任何支持javascript的浏览器,比如从IE 5开始(我认为是IE开始支持getElementById的时候,当然IE 6支持)。

于 2012-08-15T03:20:25.620 回答