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

时间:2017-04-03 19:34:44

标签: javascript php regex regex-lookarounds

我已经一直撞到这个星期一个星期,只是不能让它起作用,请你能帮帮忙吗?我处理用户输入,将其转换为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中尝试过这种方法(在regex101.com中)与$ testInput中的数据完美配合...

/(?<=<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年可以吗?

1 个答案:

答案 0 :(得分:0)

preg_replace 替换所有出现的内容,因此您应该坚持下去。事实上,背后的外观不能有*,因此不会起作用。但您可以使用捕获组来保留要保留的部分,并使用$1再次注入:

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