【问题标题】:Using preg_replace with varying variable replacements将 preg_replace 与不同的变量替换一起使用
【发布时间】:2020-05-25 16:59:30
【问题描述】:

我正在尝试使用 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);

}

【问题讨论】:

    标签: regex replace preg-replace


    【解决方案1】:

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

    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);
    

    Demo on 3v4l.org

    请注意,您的代码中有错字,将 $original 传递给对 add_regex_finders 的调用,而它应该是 $abbreviation

    【讨论】:

    • 谢谢尼克,这太棒了。我不知道正则表达式的那个方面!
    • @Ben 不用担心 - 我很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2012-03-14
    相关资源
    最近更新 更多