【问题标题】:JavaScript regex - remove empty table cell after a populated table cellJavaScript regex - 在填充表格单元格后删除空表格单元格
【发布时间】:2017-04-03 19:34:44
【问题描述】:

我已经用头撞这个一个星期了,就是无法让它工作,请你帮忙吗?我处理用户输入,将其转换为 HTML 表格。对于每个空单元格,我创建一个包含 1 个垂直制表符的单元格,然后我用它(尝试)执行以下操作:我需要删除 1 个表格单元格(包含 1 个垂直制表符),仅当它出现在表格之后包含 0 个或多个非垂直制表符的单元格。

例如...

<table>
<tr>
<td>1</td>
<td></td> // this cell should be removed
<td></td>
<td></td>
<td></td>
<td>some text</td>
<td></td> // this cell should be removed
<td></td>
<td></td>
<td></td>
<td>4973as</td>
<td></td> // this cell should be removed
<td></td>
<td></td>
<td></td>
<td>90-16</td>
<td>sdf;.s'df'f</td>
<td>£%$Dcgcfcgf</td>
<td></td> // this cell should be removed
<td></td>
<td></td>
</tr>
</table>

我正在尝试在 JavaScript 中执行此操作,并且后向似乎是答案,但 JavaScript 的正则表达式引擎不支持后向。所以我在 PHP 中尝试了这个,它与 $testInput 中的数据完美配合(在 regex101.com 中)......

/(?<=<td>[^\x0B]*<\/td>)<td>\x0B<\/td>/g

...直到我意识到 PHP 不允许使用全局修饰符。我尝试通过使用 preg_replace_all() 来解决这个问题 - 它不存在,但 preg_match_all() 存在,您可以在循环中使用它来执行 preg_replace()。这个有问题吗?警告:preg_match():编译失败:后向断言在偏移 19 处不是固定长度

$testInput = "<table id=\"testInput\"><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>4</td><td></td><td>4</td><td></td><td>4</td><td></td><td>4</td><td></td><td>4</td><td></td><td>4</td><td></td><td>4</td><td></td><td>4</td><td></td></tr><tr><td></td><td>4</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td>4</td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td>4</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td>4</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td>4</td><td></td><td></td><td></td><td>4</td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table>";

$pattern = "/(?<=<td>[^\x0B]*<\/td>)<td>\x0B<\/td>/";

    pregReplaceAll($pattern, "", $testInput);

function pregReplaceAll($find, $replacement, $s) {
    while (preg_match($find, $s)) {
        $s = preg_replace($find, $replacement, $s);
    }
    echo $s;
}

上述脚本导致输入回显,没有发生替换。

我每天都在忙着做这件事,我的大脑已经麻木了……它看起来很简单,却又很复杂。

我最后的办法是在 C#/ASP 中找到一个解决方案,但这是另一个需要学习的新东西……并不是说那是一件坏事,但 JavaScript/PHP 不能在 2017 年变得如此残缺,可以吗??

【问题讨论】:

  • 先尝试阅读文档。您会看到preg_replace 默认替换了所有出现。在 JS 中,您无需后视,使用捕获组。
  • 在JS中,你可以试试s = s.replace(/(&lt;td&gt;[^\x0B]*&lt;\/td&gt;)\s*&lt;td&gt;\x0B&lt;\/td&gt;/g, "$1"),见sample regex demo

标签: javascript php regex regex-lookarounds


【解决方案1】:

preg_replace 确实替换所有出现,所以你应该坚持下去。确实,后面不能有*,所以这行不通。但是您可以对要保留的部分使用捕获组,然后使用$1 再次注入它:

$pattern = "/(<td>[^\x0B]*<\/td>)<td>\x0B<\/td>/";
$result = preg_replace($pattern, "$1", $testInput);
echo $result;

【讨论】:

  • 感谢 trincot 和 Wiktor,我从来不知道会这样做,这让我大开眼界!很棒的地方很棒的人:)
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
相关资源
最近更新 更多