PHP находит несколько фигурных скобок в строке и заменяет текст внутри

У меня есть строка в моей базе данных, например

Label is {input:inputvalue} and date is {date:2013-2-2} 

Как я могу извлечь входные и входные значения из первой скобки, а также дату и 2013-2-3 из второй фигурной скобки и т. Д.? Таким образом,

 Label is <input name="input" value="input_value"> and date is <input name="date" value="2013-2-2"> 

Функция ниже работает только в том случае, если строка имеет {input} или {date}

 function Replace_brackets($rec){ $arr = array(" <input name="input" value='input'> ", " <input name="date" value='date'> "); $arr1 = array('{input}','{date}'); $itemvalue=str_replace($arr1,$arr,$rec); return $itemvalue; } 

В тексте может быть больше или меньше фигурных скобок, таких как 2 входных скобки и 4 привязки даты.

Есть идеи?

Related of "PHP находит несколько фигурных скобок в строке и заменяет текст внутри"

preg_replace () с обратными ссылками будет работать в этом случае http://php.net/manual/en/function.preg-replace.php :

 <?php $s = "Label is {input:inputvalue} and date is {date:2013-2-2}"; print preg_replace( "/{([^:}]*):?([^}]*)}/", "<input name='\\1' value='\\2'>", $s ); ?> 

Или, если вам нужно проанализировать пары имени и значения, как указывал @Jack, вы можете использовать версию preg_replace_callback () (вам действительно не нужно использовать htmlspecialchars () для значений атрибутов. Замените htmlspecialchars () на что угодно функция разбора применима):

 print preg_replace_callback( "/{([^:}]*):?([^}]*)}/", "generate_html", $s ); function generate_html( Array $match ) { return "<input name='".htmlspecialchars($match[1])."' value='".htmlspecialchars($match[2])."'>"; } 

Вы можете использовать регулярное выражение и функцию preg_replace_callback

 preg_replace_callback('~(\\{[^}]+\\})~', $callback, $subject); 

где subject – ваш текст и обратный вызов – функция, которая передает данную входную строку и возвращает вашу замену

для простых выражений вы можете использовать следующий пример, но это может быть преобразовано в одно preg_replace (без обратного вызова)

 $callback = function($string) { preg_match('~\\{([^:]):(.*)\\}~', $string, $m); return "<input name=\"{$m[1]}\" value=\"{$m[2]}\">"; };