2011-09-21 78 views
1

我正在使用umbraco字段的驗證由正則表達式完成。在一個字段中,我想讓用戶使用富文本編輯器(tinymce)設置文本的樣式,但我仍然想限制它們可以輸入的字符數。正則表達式驗證長度字符串,不包括html標記

我目前使用這個正則表達式,但它檢查字符的總數,所以包括html。

^[\s\S]{0,250}$ 

是否有一個正則表達式不會計算html標記中的字符。

回答

1

簡短的回答是否定的。至少,沒有任何理智的正則表達式,沒有一個先進的正則表達式引擎,允許遞歸或平衡組,也許根本沒有。可以識別並忽略HTML標記的正則表達式必須解析HTML做到這一點,並down that road lies madness.

但是,你可以使用某種形式的預處理,如jQuery在客戶端或別的東西上服務器端,解析HTML並在之前剝去標籤,然後應用長度驗證。

您確定要這麼做嗎?如果您將樣式化的輸入存儲在數據庫中,那麼這些HTML標記將與您的列大小相同,就像其他所有內容一樣。如果將這些數據存儲在varchar(250)列中,則必須將這些HTML標記計數爲250的一部分,否則將它們除去並丟失所有樣式信息。

+0

該限制是因爲它適合於具有設定高度的盒子。 – suzyb

+0

好的。在這種情況下,我建議使用jQuery或類似的東西來代替正則表達式。你可以用這種方式正確地解析HTML,你甚至可以設置一個onkeyup事件來檢查這個盒子是否已滿。或者,如果這是您的選擇,您可以將該框擴展。 –

+0

無論哪種方式,使用正則表達式來做到這一點的問題是相同的。 –

0

因爲您試圖檢測的文法是 而不是 上下文無關,所以一步完成這將很難(幾乎不可能)。兩步很簡單;只需要首先執行s/<.+?>//替換以移除所有標籤,然後再次計數。

在相關說明上,你的正則表達式有點傻。您可以使用.字符來表示任何字符;你不必做你正在使用的「空白或非空白」技巧。

^.{0,250}$ 
+0

'[\ S \ s]'技巧無疑用來匹配'\ n'字符。除非多線模式打開,'.'不會匹配換行符。此外,[HTML是上下文無](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1758162#1758162),這實際上是問題。上下文無關文法比較複雜。 –

+0

也可能值得一提的是,有有效的HTML會打破這個正則表達式。 ''

+0

@Justin:...在JavaScript中,沒有多行模式,因此'[\ s \ S]'是「任何字符,甚至是換行符」的常用成語。 –