2017-04-03 53 views
1

我一直在對這個單詞敲擊我的頭一個星期,只是無法讓它工作,請你幫忙嗎?我處理用戶輸入,將其轉換爲HTML表格。對於每個空單元格,我創建一個包含1個垂直製表符的單元格,然後用它來(嘗試)執行以下操作:只有在表格出現後才需要刪除1個表格單元格(其中包含1個垂直製表符字符)包含0個或更多非垂直製表符的單元格。JavaScript正則表達式 - 刪除填充表格單元格之後的空表格單元格

例如...

<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的正則表達式引擎不支持lookbehinds。所以,我想這在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年不能成爲這個瘸子嗎?

+0

嘗試閱讀文檔。您會看到'preg_replace'默認情況下會替換*所有匹配項*。在JS中,你不需要向後看,使用捕獲組。 –

+0

在JS中,你可以試試's = s.replace(/(​​[^ \ x0B] * <\/td>)\ s *​​\ x0B <\/td>/g,「$ 1」)',參見[樣本正則表達式演示](https ://regex101.com/r/lZtDsn/1)。 –

回答

0

preg_replace確實替換所有的事件,所以你應該堅持。的確,背後看起來不可能有*,所以不會工作。但是你可以使用一個捕獲組來保留你想要保留的部分,然後再次注入它:$1

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

謝謝trincot和Wiktor,我從不會知道這麼做,這讓人大開眼界!偉大的地方偉大的人:) –