2016-01-07 1 views
2

Я использую это (http://coursesweb.net/javascript/convert-bbcode-html-javascript_cs) как мой скрипт для разбора BBCode. Я расширил BBCodes, что он может обрабатывать, однако я столкнулся с проблемой, когда новая строка сразу следует за открывающим тегом, например.Parsing BBCode в Javascript

[code] 
    code.... 
    [/code] 

Проблема не возникает, если код «инлайн» [code]code.... [/ код] `

Регулярное выражение используется, чтобы соответствовать тому, что внутри этих тегов (.*?), которые я знаю, что не соответствует новой строки. Я пробовал ([^\r\n]) для соответствия новостям, но это тоже не сработало.

Я полагаю, что это простой вопрос, но у меня есть небольшой опыт работы с регулярным выражением, так что любая помощь будет оценена

EDIT: это полный список регулярных выражений годов я использую

var tokens = { 
'URL' : '((?:(?:[a-z][a-z\\d+\\-.]*:\\/{2}(?:(?:[a-z0-9\\-._~\\!$&\'*+,;=:@|]+|%[\\dA-F]{2})+|[0-9.]+|\\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\\])(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~\\!$&\'*+,;=:@|]+|%[\\dA-F]{2})*)*(?:\\?(?:[a-z0-9\\-._~\\!$&\'*+,;=:@\\/?|]+|%[\\dA-F]{2})*)?(?:#(?:[a-z0-9\\-._~\\!$&\'*+,;=:@\\/?|]+|%[\\dA-F]{2})*)?)|(?:www\\.(?:[a-z0-9\\-._~\\!$&\'*+,;=:@|]+|%[\\dA-F]{2})+(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~\\!$&\'*+,;=:@|]+|%[\\dA-F]{2})*)*(?:\\?(?:[a-z0-9\\-._~\\!$&\'*+,;=:@\\/?|]+|%[\\dA-F]{2})*)?(?:#(?:[a-z0-9\\-._~\\!$&\'*+,;=:@\\/?|]+|%[\\dA-F]{2})*)?)))', 
'LINK' : '([a-z0-9\-\./]+[^"\' ]*)', 
'EMAIL' : '((?:[\\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\\w\!\#$\%\'\*\+\-\/\=\?\^\`{\|\}\~]|&)[email protected](?:(?:(?:(?:(?:[a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(?:\\d{1,3}\.){3}\\d{1,3}(?:\:\\d{1,5})?))', 
'TEXT' : '(.*?)', 
'SIMPLETEXT' : '([a-zA-Z0-9-+.,_ ]+)', 
'INTTEXT' : '([a-zA-Z0-9-+,_. ]+)', 
'IDENTIFIER' : '([a-zA-Z0-9-_]+)', 
'COLOR' : '([a-z]+|#[0-9abcdef]+)', 
'NUMBER' : '([0-9]+)', 
'ALL' : '([^\r\n])', 

}; 

EDIT 2: Полный JS для сопоставления

var token_match = /{[A-Z_]+[0-9]*}/ig; 


var _getRegEx = function(str) { 
var matches = str.match(token_match); 
var nrmatches = matches.length; 
var i = 0; 
var replacement = ''; 

if (nrmatches <= 0) { 
    return new RegExp(preg_quote(str), 'g');  // no tokens so return the escaped string 
} 

for(; i < nrmatches; i += 1) { 
    // Remove {, } and numbers from the token so it can match the 
    // keys in tokens 
    var token = matches[i].replace(/[{}0-9]/g, ''); 

    if (tokens[token]) { 
    // Escape everything before the token 
    replacement += preg_quote(str.substr(0, str.indexOf(matches[i]))) + tokens[token]; 

    // Remove everything before the end of the token so it can be used 
    // with the next token. Doing this so that parts can be escaped 
    str = str.substr(str.indexOf(matches[i]) + matches[i].length); 
    } 
} 

replacement += preg_quote(str);  

return new RegExp(replacement, 'gi'); 
}; 


var _getTpls = function(str) { 
var matches = str.match(token_match); 
var nrmatches = matches.length; 
var i = 0; 
var replacement = ''; 
var positions = {}; 
var next_position = 0; 

if (nrmatches <= 0) { 
    return str;  // no tokens so return the string 
} 

for(; i < nrmatches; i += 1) { 
    // Remove {, } and numbers from the token so it can match the 
    // keys in tokens 
    var token = matches[i].replace(/[{}0-9]/g, ''); 
    var position; 

    // figure out what $# to use ($1, $2) 
    if (positions[matches[i]]) { 
    position = positions[matches[i]];  
    } else { 
    // token doesn't have a position so increment the next position 
    // and record this token's position 
    next_position += 1; 
    position = next_position; 
    positions[matches[i]] = position; 
    } 

    if (tokens[token]) { 
    replacement += str.substr(0, str.indexOf(matches[i])) + '$' + position; 
    str = str.substr(str.indexOf(matches[i]) + matches[i].length); 
    } 
} 

replacement += str; 

return replacement; 
}; 
+1

Не могли бы вы предоставить полное регулярное выражение? – Freddy

+0

Также: есть опечатка в вашем встроенном [code]. Перед закрывающим тегом вам не хватает закрывающейся косой черты. – Freddy

+0

@Freddy Я обновил вопрос сейчас, спасибо – user5697101

ответ

1

Это делает трюк для меня: (обновлено это один слишком, чтобы избежать путаницы)

\[code\]((?:.|\t|\n|\r)*?)\[\/code\] 

См regexpal и введите следующее:

[code] 
    code.... 
[/code] 

[code]code.... [/code] 

Update: Устранена регулярное выражение следующее и это работает в Chrome Console для меня:

/\[code\]((?:.|\t|\n|\r)*?)\[\/code\]/g.exec("[code]hello world \n[/code]") 
+0

Это работает в regexpal, но показывает только последний символ между тегами [code] при его реализации. – user5697101

+0

Какой код JS вы используете для соответствовать ему? – Freddy

+0

Я добавил в функции, соответствующие строкам – user5697101

1

JavaScript не обрабатывает многострочные соответствия RegExp. Вместо этого вы должны использовать трюк [\s\S], описанный в this SO answer. Может быть?

/\[code\][\s\S]*\[code\]/ 

Также RegExps, вероятно, не лучший выбор для синтаксического анализа синтаксического анализа. Это чрезвычайно сложно. Я бы предложил разбор строки и построение абстрактного дерева синтаксиса, а затем отрисовку HTML-кода.

+0

Хотя это отлично работает в regexpal, это не имеет никакого эффекта, когда я его реализую – user5697101