[英]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]
捕獲中所需的輸出: teste
和123
要匹配可選引號,應為("|'|)
, (["|\\']*)
或("|\\'?)
?
首先,讓我們更正字符串中的語法
您需要定義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]
而已!
.*?
我會使用[^\\]]+
(“]”以外的任何字符) ("|'|)
與("|'?)
(?:.|\\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.