在PHP中,我需要替换变量值周围的固定前缀和后缀。
除非值是字符串,否则将删除值周围的引号。
[blargh="5"] => <potato chips=#5#>
[blargh="97"] => <potato chips=#97#>
[blargh="StackOverflow"] => <potato chips=#"StackOverflow"#>
我知道不知怎的,我可以用preg_replace()
来做这件事,但我不知道怎么做。
答案 0 :(得分:3)
(?| ... )
您的问题中棘手的部分是,对于"StackOverflow"
,我们在替换中包含了引号,但对于"87"
我们剥离了它们。不用担心,分支重置功能可以优雅地处理。
在 Regex Demo 中,请参阅底部的替换。
示例PHP代码
$yourstring = '[blargh="5"] [blargh="97"] [blargh="StackOverflow"]';
$replaced = preg_replace('~\[blargh=(?|"(\d+)"|("[^"]*"))\]~',
'<potato chips=#\1#>',
$yourstring);
echo $replaced;
<强>输出强>
<potato chips=#5#> <potato chips=#97#> <potato chips=#"StackOverflow"#>
我们的搜索正则表达式:
\[blargh=(?|"(\d+)"|("[^"]*"))\]
我们的替换字符串
<potato chips=#\1#>
<强>解释强>
\[blargh=
匹配文字字符(?| .... )
中,所有组都捕获到第1组"(\d+)"
捕获第1组引号内的数字(但不捕获引号)|
("[^"]*")
捕获完整的"quoted string"
到第1组\]
与结束括号相匹配<potato chips=#\1#>
,\1
是对第1组的反向引用<强>参考强>
答案 1 :(得分:2)
您也可以使用callback使用正则表达式。
$text = '[blargh="5"] would convert, [blargh="97"] and [blargh="StackOverflow"]';
$text = preg_replace_callback('~\[blargh="([^"]*)"\]~',
function($m) {
$which = is_numeric($m[1]) ? $m[1] : '"'.$m[1].'"';
return '<potato chips=#' . $which . '#>';
}, $text);
echo $text;
输出
<potato chips=#5#> would convert, <potato chips=#97#> and <potato chips=#"StackOverflow"#>