JavaScript 正则表达式 - 在填充的 table 单元格之后删除空 table 单元格

JavaScript regex - remove empty table cell after a populated table cell

一个星期以来,我一直在努力解决这个问题,就是无法正常工作,你能帮忙吗?我处理用户输入,将其转换为 HTML table。对于每个空单元格,我创建一个包含 1 个垂直制表符的单元格,然后我用它来(尝试)执行以下操作:我需要删除 1 table 单元格(包含 1 个垂直制表符)只有当它出现在包含 0 个或多个非垂直制表符的 table 单元格之后。

例如...

<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():编译失败:lookbehind 断言在偏移量 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 确实 替换了所有出现的地方,所以你应该坚持下去。确实,后面不能有 *,所以那行不通。但是你可以对你想保留的部分使用捕获组,然后用 </code>:</p> 再次注入它 <pre><code>$pattern = "/(<td>[^\x0B]*<\/td>)<td>\x0B<\/td>/"; $result = preg_replace($pattern, "", $testInput); echo $result;