我有很多字符串。一些例子如下所示:
<input name="var1">
这就是它的样子。{{1,2}}
。这就是它的样子。我的代码需要使用<input name="var1" value="2">
{{a}}
的令牌
还需要使用<input name="vara">
{{a,b}}
的每个令牌
通常,每个看起来像<input name="vara" value="b">
的令牌都需要替换为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);
}
,每个令牌看起来都像{{1,2}}
{{1}}
我正在使用php。
最好的方法是什么?会有许多代币和#34;在每个字符串中替换。每个字符串都可以包含两种样式的标记。
现在,我的代码看起来像这样:
{{2}}但这显然不是很有效率,因为我循环寻找匹配。当然,我甚至不匹配看起来像{{1}}
的令牌答案 0 :(得分:1)
使用正则表达式\{\{(\d+)(,(\d+))?\}\}
Regex Explanation and Live Demo
\{
:按字面意思匹配{
,因为它是正则表达式中的特殊符号需要转义(\d+)
:匹配在第1组中捕获的一个或多个数字(,(\d+))?
:匹配一个或多个数字后跟逗号(\}
:按字面意思匹配}
$1
和$3
分别获取第一个和第三个捕获组。
示例代码使用:
$re = "/\\{\\{(\\d+)(,(\\d+))?\\}\\}/mi";
$str = "This is my first example string. asciidoctor-epub3 -D output -a ebook-format=kf8 book.adoc
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 :(得分:1)
$str = preg_replace_callback('/{{([^},]+)(?:,([^}]+))?}}/', function($_) {
return '<input name="var'.$_[1].'"' . (isset($_[2]) ? ' value="'.$_[2]. '"' : '') . '>';
}, $str);
请参阅callback
可以在demo at eval.in尝试使用正则表达式{{([^},]+)(?:,([^}]+))?}}
。否定班级[^},]
匹配}
和,
的字符。 +
一个或多个。第二部分(?:,([^}]+))?
是可选的。
答案 2 :(得分:0)
您可以使用str_replace来获取数字。
$str = str_replace(array('{{', '}}'), '' , '{{12,13}}');
输出$ str:
$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].'" />';