根据数据类型替换包含在指定字符中的字符串

时间:2017-10-20 05:54:29

标签: php regex string preg-replace

我需要替换PHP字符串中<...>中包含的字符。我使用preg_replace()执行此操作,但我需要修改此代码以执行更多操作。

这是我的代码:

$templateText = "Hi <John> , This is a test message from <9876543210>";
$repl = "test";
$patt = "/\<([^\]]+)\>/"; 
echo $template_sample  = preg_replace($patt, $repl , $templateText);

以上代码将<...>test中包含的第一个值替换为Hi test

E.g。上面的代码将显示如下字符串:

test

但是,只有在999999999不是数字时才需要将其替换为Hi test , This is a test message from 999999999 。如果所附值为数字,则应将其替换为tf.trainable_variables

我期待的是:

tf.global_variables

1 个答案:

答案 0 :(得分:1)

您可以使用preg_replace_callback的正则表达式匹配>之间的<...>以外的数字或任何0 +字符,并使用自定义逻辑进行替换:

$templateText = "Hi <John> , This is a test message from <9876543210>";
$template_sample = preg_replace_callback("/<(?:(\d+)|[^>]*)>/", function($m) {
    return !empty($m[1]) ? '999999999' : 'test';
}, $templateText);
echo $template_sample; // => Hi test , This is a test message from 999999999

请参阅PHP demo

模式详情

  • < - 文字<(这不是特殊的正则表达式,不要逃避)
  • (?:(\d+)|[^>]*) - 与以下任意一项匹配的非捕获组:
    • (\d+) - 第1组:一个或多个数字
    • | - 或
    • [^>]* - 除>
    • 以外的任何0 +字符
  • > - 文字>(这不是特殊的正则表达式,不要逃避)。

替换是一个回调函数,它获取$m匹配对象并检查组1是否匹配。如果第1组值不为空(!empty($m[1])),则匹配将替换为999999999,而替换为test