簡體   English   中英

應該使用哪個正則表達式用HTML標記替換bbcode樣式的標記

[英]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攻擊。

不應使用正則表達式。 找到一個不錯的bbcode解析器(例如PHP的BBCode )並使用它。 自己嘗試用Regex解析HTML或任何已建立的標記語言的過程中,會帶來痛苦,麻煩和不安全感。

bobince寫了一個關於用正則表達式解析HTML的史詩般的答案 ,這在這里也很重要,並且總是值得一讀。

您詢問是否使用/\\[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM