簡體   English   中英

BBCode標簽的RegExp javascript

[英]RegExp for BBCode tags javascript

我有這個RegExp,但我不知道它怎么了

tag = new RegExp('(\\['+tag+'=("|'|)(.*?)\1\\])((?:.|\\r?\\n)*?)\\[/'+tag+']','g');

bbcode標記可以有雙引號,單引號或無引號。

[tag="teste"]123[/tag]
[tag='teste']123[/tag]
[tag=teste]123[/tag]

捕獲中所需的輸出: teste123

要匹配可選引號,應為("|'|)(["|\\']*)("|\\'?)

字符串怎么了

首先,讓我們更正字符串中的語法

  • 您需要定義var tag

     tag = 'tag'; result = new RegExp( <...> ); 
  • 您在'("|'|) <...> '沒有多余的引號,需要將其轉義為("|\\'|)

  • 此外,將\\1 \\\\1\\\\1

所以現在我們有了表達式'(\\\\['+tag+'=("|\\'|)(.*?)\\\\1\\\\])((?:.|\\\\r?\\\\n)*?)\\\\[/'+tag+']' ,值:

(\[tag=("|'|)(.*?)\1\])((?:.|\r?\n)*?)\[/tag]

正則表達式有什么問題

確實只有一件事,在("|\\'|)(.*?)\\\\1您使用\\1來匹配與用作開頭的引號相同的引號。但是,1表示第一個捕獲組(第一個括號從左到右),但是("|'|)實際上是第二個括號集,第二個組。 您需要做的就是將其更改為\\2

(\[tag=("|'|)(.*?)\2\])((?:.|\r?\n)*?)\[/tag]

而已!

讓我們添加一些最終建議

  • 代替.*? 我會使用[^\\]]+ (“]”以外的任何字符)
  • 使用i修飾符(不區分大小寫的匹配,用於“ [tag] ... [/ TaG]”)
  • ("|'|)("|'?)
  • 而不是(?:.|\\r?\\n)*? 我會使用[\\s\\S]*? 如@nhahtdh建議

碼:

tag = 'tag';
result = new RegExp('(\\['+tag+'=("|\'?)([^\\]]+)\\2\\])([\\s\\S]*?)\\[/'+tag+']','gi');

備選方案: [編輯:從注釋中添加的信息]

result = new RegExp('\\['+tag+'(?:=("|\'?)([^\\]]+)\\1)?\\]([\\s\\S]*?)\\[/'+tag+']', 'gi');

關於第二個問題:盡管(["|\\']*)("|\\'?)都將匹配,但是后者是您要匹配的正確方法。 *尋找0到無限重復, | 在字符類中被解釋為文字。 而是("|\\'?)匹配單引號,雙引號或不匹配。

暫無
暫無

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

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