[英]Which regexp should be used to replace bbcode-style tags with HTML tags
我想替換一些特定的字母(got from user input)
以替換為特定的html標簽,例如<b>,<u>,<i>,etc
。 我在javascript中使用了一些正則表達式,但無法確定哪種使用最好。 我在用
/\[u\](.*?)\[u\]/g // replace with <u>$1</u>
/*
* if i type [u]underline[][u] //this allows '[]' braces
*/
還是我應該使用
/\[u\]\([^\[u\]]+)\[u\]/g // this doesn't allow third braces to be underlined
我也在php中使用相同的正則表達式。 我很困惑哪種類型的正則表達式可以免受xss
攻擊。
您詢問是否使用/\\[u\\](.*?)\\[u\\]/g
或/\\[u\\]\\([^\\[u\\]]+)\\[u\\]/g
。 兩種模式均未設計有結尾標簽,這一點很重要。 [u]underlined text[/u]
是BBCode
使用擴展正則表達式的解決方案可能是使用遞歸模式 。 我認為JavaScript還沒有支持 ,但是可以正常使用,例如,使用PCRE的 PHP 。
問題: 標簽可以嵌套 ,這將使其難以匹配最外層的標簽 。
了解此PHP示例中以下模式的作用:
$str =
'The [u][u][u]young[/u] quick[/u] brown[/u] fox jumps over the [u]lazy dog[/u]';
1.)使用非貪心 點 匹配 [u]...[/u]
中的任何字符
$pattern = '~\[u\](.*?)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);
輸出 :
The <u>[u][u]young</u> quick[/u] brown[/u] fox jumps over the <u>lazy dog</u>
查找[u]
的第一個出現,並吃掉盡可能少的字符以滿足條件[/u]
,這會導致標簽不匹配。 因此,這是一個不好的選擇。
2.)對[u]...[/u]
內的內容使用方括號 [^[\\]]
取反
$pattern = '~\[u\]([^[\]]*)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);
輸出 :
The [u][u]<u>young</u> quick[/u] brown[/u] fox jumps over the <u>lazy dog</u>
它看起來為第一次出現的[u]
隨后的任何字符的量,即不[
或]
滿足條件[/u]
它“更安全”,因為它只匹配最內層的元素,但仍然需要付出額外的努力才能從內而外解決。
3.)對[u]...[/u]
內的內容使用遞歸 +方括號[^[\\]]
否定
$pattern = '~\[u\]((?:[^[\]]+|(?R))*)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);
輸出 :
The <u>[u][u]young[/u] quick[/u] brown</u> fox jumps over the <u>lazy dog</u>
與第二種模式類似:查找[u]
的第一次出現,然后匹配一個或多個不是[
或]
字符,或將整個模式粘貼在(?R)
。 整個事情執行零次或多次,直到條件[/u]
匹配為止。
為了擺脫里面尚未解決的bb-tag,我們現在可以輕松地將其刪除:
$str = preg_replace('~\[/?u\]~',"",$str);
並按需獲得:
輸出 : The <u>young quick brown</u> fox jumps over the <u>lazy dog</u>
當然,有多種方法可以實現它,例如preg replace回調,或者對於JavaScript而言,可以使用回調作為替代的replace()方法 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.