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

标签 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 中执行此操作,lookbehind 似乎是答案,但 JavaScript 的正则表达式引擎不支持lookbehinds。所以我在 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;
}

上面的脚本会导致输入回显,但没有发生替换。

我每天都在埋头苦干,我的大脑已经 NumPy 了......它看起来很简单,但又很复杂。

我的最后一招是在 C#/ASP 中找到解决方案,但这是另一个需要学习的新东西...这并不是一件坏事,但 JavaScript/PHP 在 2017 年不会这么瘫痪吧?

最佳答案

preg_replace 确实替换所有出现的内容,因此您应该坚持这样做。事实上,后面的内容不能有 * ,所以这是行不通的。但是您可以对要保留的部分使用捕获组,然后使用 $1 再次注入(inject):

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

关于JavaScript 正则表达式 - 删除填充表格单元格后的空表格单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43192875/

相关文章:

javascript - 如何在没有服务的情况下将 ajax 与 mvc4 一起使用?

javascript - Google 的 Api 图表区域。在图表中绘制 2 个图形

javascript - 使用 <h :outputScript> to add javascript code in JSF

php - 在处理期间使用 PHP 输出缓冲发出 JavaScript

java - 正则表达式用图像标签替换特定字符串?

javascript - 通过 Ajax 加载 CSV 数据以在 Highcharts 中显示

php - fputcsv() 为每个条目添加引号?

php - 从具有最大日期和特定外键的记录中选择信息

php - mod_rewrite 和带有参数的完整 url 作为参数

正则表达式如何匹配 dd mmm yyyy 以仅选择年份的前两位数字