我已经为这个问题苦苦挣扎了一个星期了,就是无法让它工作,你能帮忙吗?我处理用户输入,将其转换为 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/