替换,但仅在某些情况下包括分隔符

时间:2014-07-31 03:30:12

标签: php regex string

在PHP中,我需要替换变量值周围的固定前缀和后缀。

除非值是字符串,否则将删除值周围的引号。

[blargh="5"]                  =>   <potato chips=#5#>
[blargh="97"]                 =>   <potato chips=#97#>
[blargh="StackOverflow"]      =>   <potato chips=#"StackOverflow"#>

我知道不知怎的,我可以用preg_replace()来做这件事,但我不知道怎么做。

2 个答案:

答案 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"#>