簡體   English   中英

正則表達式替換{{a,b}}和{{a}}

[英]Regular Expressions to replace {{a,b}} and {{a}}

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

  1. 這是我的第一個示例字符串。 {{1}}這就是它的樣子。
  2. 這是我的第二個示例字符串。 {{1,2}}。 這就是它的樣子。
  3. 這是我的第三個示例字符串。 {{1,3}}和{{2}}。 這就是它的樣子。

我的代碼需要用<input name="var1">替換每個看起來像{{1}}標記

它還需要用<input name="var1" value="2">替換每個看起來像{{1,2}}標記

通常,每個看起來像{{a}}令牌都需要用<input name="vara">替換,每個令牌看起來像{{a,b}}其中<input name="vara" value="b">

我正在使用PHP。

什么是最好的方法來做到這一點。 在每個字符串中將有許多“標記”被替換。 每個字符串都可以包含兩種樣式的標記。

現在,我的代碼看起來像這樣:

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}}的令牌

使用正則表達式\\{\\{(\\d+)(,(\\d+))?\\}\\}

正則表達式解釋和現場演示

  1. \\{ :匹配{字面意思,需要逃脫,因為它是正則表達式中的特殊符號
  2. (\\d+) :匹配在組1中捕獲的一個或多個數字
  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);

你需要使用回調

$str = preg_replace_callback('/{{([^},]+)(?:,([^}]+))?}}/', function($_) {
    return '<input name="var'.$_[1].'"' . (isset($_[2]) ? ' value="'.$_[2]. '"' : '') . '>';
}, $str);

請參閱eval.in上的演示

可以在regex101上嘗試正則表達式{{([^},]+)(?:,([^}]+))?}} 否定類[^},]匹配既不是}也不, +一個或多個。 第二部分(?:,([^}]+))? 是可選的。

你可以使用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].'" />';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM