【问题标题】:How to get content between <td></td> only if no nested tags are present?仅当不存在嵌套标签时,如何在 <td></td> 之间获取内容?
【发布时间】:2017-04-20 07:54:31
【问题描述】:

我意识到有很多关于在某些东西之间获取某些东西的问题,甚至特别是 HTML 标签。但我的要求有所不同,因为如果存在嵌套标签,我不会忽略 &lt;td&gt;&lt;/td&gt; 内容。如果仍然存在重复,请标记此内容并将我指向那个。

示例输入&lt;td&gt;&lt;p&gt;column1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;column2&lt;/td&gt;
预期输出:column2(太棒了!)或>column2

根据this 的问题,我尝试了&lt;td&gt;(.*?)&lt;\/td&gt; 并得到了2 个匹配项:

<td><p>column1</p></td>
<td>column2</td>

根据标记的答案,我尝试了&gt;[^&lt;]*&lt; 并得到了这个:

差不多了。我可以得到 > 和 <td> 因为它有 &lt;p&gt; 嵌套在其中。

假设&lt;p&gt; 在嵌套的情况下始终是最内层的标签。如果输入为&lt;td&gt;&lt;p&gt;column1&lt;/p&gt;postfix&lt;/td&gt;,则忽略&lt;td&gt;

【问题讨论】:

标签: javascript html regex


【解决方案1】:

您不应该使用正则表达式来解析 HTML,因为 HTML 不是常规语言。我是too complex to be parsed by regular expressions

你可以做的是使用浏览器的内置解析器,然后使用 DOM 方法得到你想要的。

var s = '<td><p>column1</p></td><td>column2</td>'
var content = [];

// Create a row to insert the markup into
var tr = document.createElement('tr');
tr.innerHTML = s;

// Get the cells
var tds = tr.cells;

// If a cell doesn't have any element content, put its
// textContent into array
for (var i=0, iLen = tds.length; i<iLen; i++) {
 if (tds[i].children.length == 0) {
   content.push(tds[i].textContent);
 }
}

console.log(content);

【讨论】:

  • 同意,这看起来既简单又干净。但这不适用于&lt;td&gt;&lt;a&gt;column2&lt;/a&gt;&lt;/td&gt;。请注意,要求只有在嵌套了p 时才忽略td。休息应该被捡起来。所以另一个循环检查children是否包含&lt;p&gt;!我正在走这条路,但说真的,这对我正在做的事情来说有点过头了。
  • 限制“…仅当它嵌套了 p”在 OP 中并不清楚,但 if (!tds[i].querySelector('p')) 会完成这项工作。我看不出任何正则表达式答案如何仅限于忽略带有嵌套 P 元素的 TD。
【解决方案2】:

var html='<td><p>column1</p></td><td>column2</td>';
var regex=/<td>([^<]*)<\/td>/ig;
var result=regex.exec(html);
console.info(result);
console.info(result[1]);

你可以试试 this.result[1] is you want 。 如果你想替换标签之间的内容,你也可以这样写:

     var html='<td><p>column1</p></td><td>column2</td>';
var regex=/<td>([^<]*)<\/td>/ig;
var newHtml=html.replace(regex,function(){
	return '<td>'+'replacement'+'</td>';
});
console.info(newHtml);

【讨论】:

  • 这会正确选择所需的td,但也会返回标签。请注意,我不能替换标签是有原因的。
  • 我想替换部分/全部内容,所以如果我的搜索输入是“td”,它也会替换td 标签。这会破坏一切。
  • 此正则表达式与&lt;td&gt;&lt;a&gt;column2&lt;/a&gt;&lt;/td&gt; 不匹配。请注意,要求仅当它嵌套了p 时才忽略td。应该拿起休息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多