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

时间:2015-11-05 06:06:24

标签: php regex

我有很多字符串。一些例子如下所示:

  1. 这是我的第一个示例字符串。 <input name="var1">这就是它的样子。
  2. 这是我的第二个示例字符串。 {{1,2}}。这就是它的样子。
  3. 这是我的第三个示例字符串。 {{1,3}}和
    {{1,2}}
    。这就是它的样子。
  4. 我的代码需要使用<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}}

    的令牌

3 个答案:

答案 0 :(得分:1)

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

Regex Explanation and Live Demo

  1. \{:按字面意思匹配{,因为它是正则表达式中的特殊符号需要转义
  2. (\d+):匹配在第1组中捕获的一个或多个数字
  3. (,(\d+))?:匹配一个或多个数字后跟逗号(
  4. \}:按字面意思匹配}
  5. 替换中使用

    $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)

您需要使用enter image description here

$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].'" />';