首页 > 解决方案 > 将 preg_replace 与不同的变量替换一起使用

问题描述

我正在尝试使用 preg_replace 搜索字符串,但仅以动态方式替换字符串的一部分,而不是整个字符串。

例如,我可以使用下面的代码找到字符串 'od'、':od'、'od:'、'#od' 和 'od'。我只想用“里程表”这个词替换“od”部分,而保持冒号、标签和空格不变。但是,我当前 preg_replace 的编写方式除了字母本身之外,还会替换冒号和主题标签。任何创造性的解决方案来仅替换字符但保留周围的符号?

谢谢!

if(isset($_POST["text"]))
{
    $original = $_POST["text"];
    $abbreviation= array();
    $abbreviation[0] = 'od';
    $abbreviation[1] = 'rn';        
    $abbreviation[2] = 'ph';
    $abbreviation[3] = 'real';  
    $translated= array();
    $translated[0] ='odometer';
    $translated[1] ='run';
    $translated[2] ='pinhole';
    $translated[3] ='fake';

function add_regex_finders($str){
    return "/[\s:\#]" . $str . "[\s:]/i";
}

$original_parsed = array_map('add_regex_finders',$original);
preg_replace($original_parsed,$translated,$original);

}

标签: regexreplacepreg-replace

解决方案


您可以在匹配的缩写前后的字符周围添加捕获组,然后将组引用添加到替换字符串:

function add_regex_finders($str){
    return "/([\s:\#])" . $str . "([\s:])/i";
}

$abbrevs_parsed = array_map('add_regex_finders', $abbreviation);
$translt_parsed = array_map(function ($v) { return '$1' . $v . '$2'; }, $translated);
echo preg_replace($abbrevs_parsed, $translt_parsed, $original);

3v4l.org 上的演示

请注意,您的代码中有一个错字,传递$originaladd_regex_finderswhen it should be的调用$abbreviation


推荐阅读