2015-11-05 4 views
5

У меня много строк. Ниже приведены некоторые примеры:Регулярные выражения для замены {{a, b}} и {{a}}

  1. Это моя первая примерная строка. {{1}} Вот как это выглядит.
  2. Это моя вторая примерная строка. {{1,2}}. Вот как это выглядит.
  3. Это моя третья примерная строка. {{1,3}} и {{2}}. Вот как это выглядит.

Мой код должен заменить каждый маркер, который выглядит как {{1}} с <input name="var1">

Он также должен заменить каждый маркер, который выглядит как {{1,2}} с <input name="var1" value="2">

В общем, каждый маркер, который выглядит как {{a}} потребности для замены на <input name="vara"> и каждый токен, который выглядит как {{a,b}} с <input name="vara" value="b">

Я - php.

Что было бы лучшим способом сделать это. В каждой строке будет заменено много «токенов». И каждая строка может иметь токены обоих стилей.

Прямо сейчас, мой код выглядит следующим образом:

for ($y = 1; $y < Config::get('constants.max_input_variables'); $y++) { 
    $main_body = str_replace("{{" . $y . "}}", "<input size=\"5\" class=\"question-input\" type=\"text\" name=\"var" . $y . "\" value=\"".old('var'.$y)."\" >", $main_body); 
} 

Но это, очевидно, не очень эффективен, так как I перебрать в поисках совпадений. И конечно же, я даже не соответствующие маркеры, которые выглядят как {{1,2}}

+0

Wow, nice требование. Как вы его разрешите? – Tushar

+0

, пожалуйста, объясните свои требования более четко –

+0

Я ищу эффективный способ заменить токены формата {{a, b}} и {{a}} в строке с использованием php. Где a и b являются целыми числами –

ответ

1

Использование регулярных выражений \{\{(\d+)(,(\d+))?\}\}

Regex Explanation and Live Demo

  1. \{: Матчи { буквально, нужно бежать, как это специальный символ в регулярных выражениях
  2. (\d+): Соответствует одной или нескольким цифрам, снятым в группе 1
  3. (,(\d+))? : Соответствует одному или более цифр с последующей запятой необязательно
  4. \}: Соответствует } буквально

$1 и $3 используются в замене, чтобы получить первую и третью группу захваченной соответственно.

Пример кода Использование:

$re = "/\\{\\{(\\d+)(,(\\d+))?\\}\\}/mi"; 
$str = "This is my first example string. {{1}} This is what it looks like.\nThis is my second example string. {{1,2}}. This is what it looks like.\nThis is my third example string. {{1,3}} and {{2}}. This is what it looks like."; 
$subst = "<input name=\"var$1\" value=\"$3\" />"; 

$result = preg_replace($re, $subst, $str); 
+1

Эта замена установит атрибут 'значение' с пустым значением. Я думаю, что решение 'preg_replace_callback' более жизнеспособно в этом контексте. –

+0

@stribizhev Право! Невозможно добавить сейчас, поскольку он добавлен как другой [ответ] (http://stackoverflow.com/a/33539371/2025923) – Tushar

1

Вы должны использовать callback:

$str = preg_replace_callback('/{{([^},]+)(?:,([^}]+))?}}/', function($_) { 
    return '<input name="var'.$_[1].'"' . (isset($_[2]) ? ' value="'.$_[2]. '"' : '') . '>'; 
}, $str); 

См demo at eval.in

Регулярное выражение {{([^},]+)(?:,([^}]+))?}} можно попробовать на regex101.Отрицательный класс [^},] соответствует символам, которые не }, ни ,. + один руда более. Вторая часть (?:,([^}]+))? не является обязательной.

0

вы можете использовать str_replace для получения номера.

$str = str_replace(array('{{', '}}'), '' , '{{12,13}}'); 

выход $ ул:

$str = '12,13'; 

затем используйте $arr = explode(',', $str), вы можете получить два числа: 12 and 13

так <input>. просто используйте $arr[0] для заполнения name и $arr[1] для заполнения value. все коды:

$str = str_replace(array('{{', '}}'), '' , '{{12,13}}'); 
$arr = explode(',', str); 
return '<input name="var'.$arr[0].'" value="'.$arr[1].'" />'; 
Смежные вопросы