正则表达式替换{{a,b}}和{{a}}。

5

我有许多文本字符串,以下是一些示例:

  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。

最好的方法是什么?每个字符串中都会有许多要替换的 "token"。并且每个字符串都可以具有两种风格的标记。

现在,我的代码看起来像这样:

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}}的标记。


哇,好棒的需求。你打算怎么解决呢? - Tushar
请更清楚地解释您的要求。 - ffff
1
\{\{(\d+)(,(\d+))?\}\} 代码: `$re = "/\{\{(\d+)(,(\d+))?\}\}/mi"; $str = "这是我的第一个示例字符串。{{1}} 这就是它的样子。\n这是我的第二个示例字符串。{{1,2}}。这就是它的样子。\n这是我的第三个示例字符串。{{1,3}} 和 {{2}}。这就是它的样子。"; $subst = "<input name="var$1" value="$3" />"; $result = preg_replace($re, $subst, $str);` - Tushar
@Tushar,您能把那个作为答案吗? - hjpotter92
1
另外还有一个解决方案:获取大括号内的子字符串,使用逗号分隔并添加替换。 - Wiktor Stribiżew
显示剩余3条评论
3个回答

1

使用正则表达式\{\{(\d+)(,(\d+))?\}\}

正则表达式解释和实时演示

  1. \{: 匹配字符{,需要转义因为它是正则表达式中的特殊符号
  2. (\d+): 匹配一个或多个数字,捕获在第一组中
  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
这个替换将会把属性value设置为空值。我认为在这种情况下,preg_replace_callback解决方案更可行。 - Wiktor Stribiżew
@stribizhev 对的!现在不能添加了,因为它已经作为另一个答案添加了。 - Tushar

1
你需要使用一个回调函数
$str = preg_replace_callback('/{{([^},]+)(?:,([^}]+))?}}/', function($_) {
    return '<input name="var'.$_[1].'"' . (isset($_[2]) ? ' value="'.$_[2]. '"' : '') . '>';
}, $str);

请查看 在 eval.in 上的演示

正则表达式 {{([^},]+)(?:,([^}]+))?}} 可以在 regex101 上尝试。否定类 [^},] 匹配既不是 } 也不是 , 的字符。 + 表示一个或多个。第二部分 (?:,([^}]+))? 是可选的。


0
你可以使用 str_replace 来获取数字。
$str = str_replace(array('{{', '}}'), '' , '{{12,13}}');

输出 $str:

$str = '12,13';

然后,使用$arr = explode(',', $str),你可以得到两个数字:12和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].'" />';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接