Парсер заменяет шаблон - PullRequest
0 голосов
/ 04 октября 2011

У меня проблемы с рисунком.Мне нужно обработать некоторый текст, например:

<div>{text1}</div><span>{text2}</span>

После этого мне нужно получить вместо {text1} и {text2} несколько слов из словаря.Я готовлю интерфейс для разных языков.Это в PHP.Сейчас у меня есть что-то вроде этого, но это не работает:

function translate_callback($matches) {
  global $dict;
  print_r($matches);
  return 'replacement';
}

function translate($input) {
  return preg_replace_callback('/(\{.+\})/', 'translate_callback', $input);
}

echo translate('<div>{bodynum}</div><span>{innernum}</span>');

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

{bodynum}</div><span>{innernum}

но я хочу шаблон, который будет соответствовать

{bodynum} and then {innernum}

Может кто-нибудь помочь мне с этим.Спасибо.

Решение:

Чтобы сопоставить любой символ между {и}, но не жадничать - сопоставьте самую короткую строку, которая заканчивается на} (знак? Stop + жадный).

Таким образом, шаблон теперь выглядит так: '/ average(.+?)‹/' и является именно тем, что я хочу.

Ответы [ 3 ]

0 голосов
/ 04 октября 2011

попробуй с

// this will call my_callback() every time it sees brackets  
$template = preg_replace_callback('/\{(.*)\}/','my_callback',$template);  

function my_callback($matches) {  
    // $matches[1] now contains the string between the brackets  

    if (isset($data[$matches[1]])) {  
        // return the replacement string  
        return $data[$matches[1]];  
    } else {  
        return $matches[0];  
    }  
}

Ссылка

0 голосов
/ 04 октября 2011

Как вы правильно заметили в комментариях, вы можете использовать несвязное совпадение , чтобы остановиться на первой закрывающей скобке, а не на последней:

preg_replace_callback('/(\{.+?\})/', 'translate_callback', $input);

Как отмечает Дэмиен, вы также можете использовать модификатор /U, чтобы сделать все матчи несвязанными по умолчанию.

В качестве альтернативы вы можете ограничить набор символов, разрешенных между фигурными скобками, до некоторого набора, который не включает }:

preg_replace_callback('/(\{[^}]+\})/', 'translate_callback', $input);

или даже:

preg_replace_callback('/(\{\w+\})/', 'translate_callback', $input);

, который допускает использование только символов слова между фигурными скобками. Это может (или не может) быть немного более эффективным, чем использование несвязного сопоставления, из-за того, как работает механизм PCRE. На практике, конечно, вряд ли будет какая-либо заметная разница.

0 голосов
/ 04 октября 2011

Вы должны использовать модификатор 'U' в вашем паттерне. Подробнее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...