Php Preg#U仅在其';这是唯一的字眼

Php Preg#U仅在其';这是唯一的字眼,php,preg-replace,str-replace,Php,Preg Replace,Str Replace,当字符串只存在于一个单词之外时,我如何替换它 例如: 以下是: G-star原材料 G-STAR G-star 我想将它们全部改为G-STAR RAW: $x = preg_replace('/(G-star)\b/', 'G-STAR RAW', $x);` 但我也得到了: G-STAR RAW RAW 它还替换了示例nr 1中的G-Star。如果我说它只能在该字符串中工作,而不是在该字符串中有更多单词时工作,我该如何替换它?模糊匹配 也许一个包含levenshtein距离的算法更有用

当字符串只存在于一个单词之外时,我如何替换它

例如: 以下是:

  • G-star原材料
  • G-STAR
  • G-star
  • 我想将它们全部改为G-STAR RAW:

    $x = preg_replace('/(G-star)\b/', 'G-STAR RAW', $x);`
    
    但我也得到了:

    G-STAR RAW RAW
    
    它还替换了示例nr 1中的G-Star。如果我说它只能在该字符串中工作,而不是在该字符串中有更多单词时工作,我该如何替换它?

    模糊匹配 也许一个包含
    levenshtein
    距离的算法更有用

    函数猜测($in){
    $in=strtolower($in);
    $known_brands=数组(
    “G-STAR RAW”=>数组(“G-STAR RAW”、“G-STAR”),
    “Brand-X”=>阵列(“brandx”),
    “Brand-Y”=>数组(“brandy”),
    );
    $champion=false;
    $最低分数=999;
    foreach($key=>$value的知名品牌){
    foreach(价值为$val){
    $score=levenshtein($in$val);
    如果($分数<$最低分数){
    $最低分数=$分数;
    $champion=$key;
    }
    }
    }
    返回$champion;
    }
    var_dump(猜测(“gstar”);
    var_dump(猜测(“G-STAR”);
    var_dump(猜测(“Jacky”));
    var_dump(猜测(“布兰登”);
    字符串(10)“G-STAR原始”
    字符串(10)“G-STAR原始”
    串(7)“品牌-Y”
    串(7)“品牌-X”
    
    尝试添加一个可选匹配项,在文本中查找现有的
    原始

    (G-star(?: raw)?)\b
    
    preg\u replace()
    中,它看起来像:

    $x = preg_replace('/\b(G-star(?: raw)?)\b/i', 'G-STAR RAW', $x);
    
    还要注意在正则表达式中添加的
    i
    选项以忽略大小写敏感度

    输出:


    更新添加了一个前导的
    \b
    ,以防止“g-star”出现在“big-star”等其他单词中。

    如果您只需要替换上述字符串,则可以使用以下命令:

    $txt = preg_replace('~\bg-star(?: raw)?\b~i', 'G-STAR RAW', $txt);
    
    $x = preg_replace('/(G\-[starSTAR]+(\s*[rawRAW]+)?)/', 'G-STAR RAW', $x);
    
    $x = preg_replace('/([A-Z]\-[A-Za-z]+(\s*[a-zA-Z]+)?)/', 'G-STAR RAW', $x);
    
    如果您的字符串与您提供给我们的字符串相似,则可以使用以下字符串:

    $x = preg_replace('/(G\-[starSTAR]+(\s*[rawRAW]+)?)/', 'G-STAR RAW', $x);
    
    $x = preg_replace('/([A-Z]\-[A-Za-z]+(\s*[a-zA-Z]+)?)/', 'G-STAR RAW', $x);
    

    最后一个表达式将匹配以大写字母开头的任何字符串,后跟破折号(-),后跟小写和大写字符的任意组合,可能后跟一个或多个字符,最后是大写和小写字符的任意组合。

    @FritsvanCampen Good catch;我已经更新了我的答案(和代码板示例),使之成为领先的
    \b
    。谢谢=]我现在正在尝试它(需要为它做一个大的提要导入。当我有结果时会让你知道是的,确实有效。非常感谢。你介意向我解释一下吗?我理解单词边界,但是(?:word)到底做什么呢?:代表什么?@inTOWN
    (?:
    是一个不匹配的组;在这种情况下,它不是真正必要的(您可以简单地使用
    );但是,为了防止您使用
    preg_match()
    结尾表示“可选”;它可能出现0或1次(也可以使用
    {0,1}编写)
    取而代之)。非常感谢!@newfurniture