簡體   English   中英

使用正則表達式替換塊中的特殊字符

[英]replace special characters within a block using regex

我需要替換[code]塊之間的所有<和>。 我不想選擇並替換[code]中的所有內容,我只想選擇其中的<和>,然后將其臨時替換為另一個字符。 進行其他替換,然后將它們返回到[code]中的<>。

我使用的解決方案:

replace(/<(?=[^\[]*\[\/code\])/gi,"&_lt_;"); 
replace(/>(?=[^\[]*\[\/code\])/gi,"&_gt_;"); 

DO OTHER REPLACEMENT/CUSTOMIZATION HERE 

replace(/&_lt_;/gi,"<"); 
replace(/&_gt_;/gi,">"); 

唯一的問題是,如果[code]之間的內容包含字符[,則它在塊中該字符之前不起作用。 我怎樣才能解決這個問題?

有效的示例:

<b>
[code]
<form action="nd.php" method="post">
<b>
<strong>
[/code]
<b>

無效的示例:

<b>
[code]
<form action="nd.php" method="post">
<b>
$_POST[
<strong>
[/code]
<b>

編輯:請僅提供簡單的正則表達式替換解決方案。 我不能為此問題使用回調函數。

對於“有效的示例”,鏈接問題的已接受答案對我不起作用。 但是,另一個答案也可以 -它也適用於“ 示例不起作用 ”(盡管有錯字)。

嘗試以下正則表達式:

/(\[code\][\s\S]*?\[\/code\])|<[\s\S]*?>/g

replace()函數中,您將使用:

.replace(/(\[code\][\s\S]*?\[\/code\])|<[\s\S]*?>/g, '$1'); 

編輯
如果我理解正確,您的最終目標是使[code][/code]的所有內容都相同-但能夠替換這些標簽之外的所有HTML標簽(這可能意味着或可能並不意味着完全去除字符)?

如果是這種情況,則不需要很長的正則表達式列表。 可以使用上面的正則表達式(稍作修改),它可以涵蓋許多情況。 將正則表達式/替換與回調函數結合使用以處理您的額外替換:

var replaceCallback = function(match) {
    // if the match's first characters are '[code]', we have a '[code][/code]' block
    if (match.substring(0, 6) == '[code]') {
        // do any special replacements on this block; by default, return it untouched
        return match;
    }
    // the match you now have is an HTML tag; it can be `<tag>` or `</tag>`
    // do any special replacements; by default, return an empty string
    return '';
}

str = str.replace(/(\[code\][\s\S]*?\[\/code\])|(<[\s\S]*?>)/g, replaceCallback);

一個正則表達式修改是在html-tag部分(正則表達式的第二部分)周圍添加一個組。 這將允許它傳遞給回調函數。

UPDATE[code]不是文字)
通過評論,我意識到標記[code]不是文字的-您想覆蓋所有BBCode樣式的標記。 就像上面的示例一樣簡單(在回調中更容易)。 您可以使用[az]+代替所有正則表達式來代替正則表達式中的單詞code 然后,在回調內部,您只需檢查第一個字符即可; 如果是[ ,則說明您在代碼塊中-否則,您有一個HTML代碼位於代碼塊之外:

var replaceCallback = function(match) {
    // if the match's first character is '[', we have a '[code][/code]' block
    if (match.substring(0, 1) == '[') {
        // do any special replacements on this block; by default, return it untouched
        return match;
    }
    // the match you now have is an HTML tag; it can be `<tag>` or `</tag>`
    // do any special replacements; by default, return an empty string
    return '';
}

str = str.replace(/(\[[a-z]+\][\s\S]*?\[\/[a-z]+\])|(<[\s\S]*?>)/gi, replaceCallback);

另請注意,我在正則表達式的選項中添加了一個i以忽略大小寫(否則,您需要[a-zA-Z]來處理大寫字母)。

這是我編輯的答案。 再次抱歉。

str = str.replace(/(\[code\])(.*?)(\[\/code\])/gm,function(a,b,c,d) {
    return b + c.replace(/</g,'&lt;').replace(/>/g,'&gt;') + d;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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