0

我的数据库中有字符串,例如

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

如何从第一个大括号中提取 input 和 inputvalue,从第二个大括号中提取 date 和 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 个日期大括号。

有任何想法吗?

4

2 回答 2

6

在这种情况下,带有反向引用的 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])."'>";
}
于 2013-02-14T23:31:17.570 回答
1

您可以使用正则表达式和 preg_replace_callback 函数

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

其中主题是您的文本并回调一个处理给定输入字符串并返回您的替换的函数

对于简单的表达式,您可以使用下一个示例,但这可以转换为单个 preg_replace(没有回调)

$callback = function($string) {
    preg_match('~\\{([^:]):(.*)\\}~', $string, $m);
    return "<input name=\"{$m[1]}\" value=\"{$m[2]}\">";
};
于 2013-02-14T23:29:17.870 回答