【发布时间】: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(/(<td>[^\x0B]*<\/td>)\s*<td>\x0B<\/td>/g, "$1"),见sample regex demo。
标签: javascript php regex regex-lookarounds