2017-01-27 31 views
0

Я работаю над переводом сайта (Smarty) с помощью Poedit. Чтобы получить весь текст из файлов .tpl, я использую regex для получения данных между {t} и {/ t}. поэтому пример:Регулярное выражение: чтение значения между несколькими скобками

{t}Password incorrect, please try again{/t} 

Регулярное выражение будет читать Password incorrect, please try again и поместить его в файл .po. Все это прекрасно работает. Это происходит неправильно, когда он становится немного более продвинутым.

Иногда текст между тегами {t} использует параметр. это выглядит так:

{t 1=$email|escape 2=$mailbox}No $1 given, please check your $2{/t} 

Это также отлично работает.

Реальная проблема начинается, когда я использовать скобки внутри параметра, как это:

{t 1={site info='name'} 2=$mailbox}visit %1 or go to your %2{/t} 

Моя регулярное выражение будет закрыто, когда он видит первые закрывающие скобки, так что результат будет 2=$mailbox}visit %1 or go to your %2.

Моя регулярное выражение выглядит следующим образом:

\{t.*?\}?[}]([^\{]+)\{\/t\}|\{t\}([^\{]+)\{\/t\} 

Регулярное выражение используется внутри программы Java.

Есть ли способ устранить эту проблему?

+1

Исправления написать парсер для обработки вложенных скобок. Regex не очень хорошо справляется с этим типом проблемы. –

ответ

0

Самое простое решение, которое я вижу на этом, это нормализовать файлы .tpl. Просто используйте регулярное выражение, которое соответствует всем тегам что-то вроде этого:

{[^}]*[^{]*} 

Я была такая же проблема, чтобы решить, и она работала очень хорошо с нормализацией.

Нормализующий-метод будет выглядеть следующим образом:

final String regex = "\\{[^\\}]*[^\\{]*\\}"; 

private String normalizeContent(String content) { 
    return content.replaceAll(regex, ""); 
}