[英]Regular Expressions to replace {{a,b}} and {{a}}
我有很多字符串。 一些例子如下所示:
我的代碼需要用<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+))?\\}\\}
\\{
:匹配{
字面意思,需要逃脫,因為它是正則表達式中的特殊符號 (\\d+)
:匹配在組1中捕獲的一個或多個數字 (,(\\d+))?
:匹配一個或多個數字,后跟逗號(可選) \\}
:匹配}
字面意思 替換中使用$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.