Preg_replace只有当它是唯一的单词时

时间:2013-11-26 16:59:04

标签: php preg-replace str-replace

当一个字符串只存在于那个单词中时,我怎么能preg_replace?

实施例: 进来是:

  1. G-star Raw
  2. G-STAR
  3. G-星
  4. 我想将它们全部更改为G-STAR RAW:

    $x = preg_replace('/(G-star)\b/', 'G-STAR RAW', $x);`
    

    但我也得到了:

    G-STAR RAW RAW
    

    它还在示例nr 1中替换了G-Star。我怎么做替换,说它只能在它正好是那个字符串时工作,而不是当字符串中有更多的单词?

4 个答案:

答案 0 :(得分:2)

尝试添加可选匹配项,以查找文本中的现有raw

(G-star(?: raw)?)\b

preg_replace()中,它看起来像是:

$x = preg_replace('/\b(G-star(?: raw)?)\b/i', 'G-STAR RAW', $x);

另请注意正则表达式中添加的i选项可忽略区分大小写。

Codepad Example输出:

1  G-star Raw = G-STAR RAW
2  G-STAR = G-STAR RAW
3  G-star = G-STAR RAW

更新添加了一个前导\b,以阻止“g-star”出现在“大明星”之类的其他词语中。

答案 1 :(得分:0)

模糊匹配

也许涉及levenshtein距离的算法更有用?

http://codepad.org/q4TKz5eH

function guess($in) {
    $in = strtolower($in);
    $known_brands = array(
        "G-STAR RAW" => array("g-star raw", "g-star"),
        "Brand-X" => array("brandx"),
        "Brand-Y" => array("brandy"),
    );
    $champion = false;
    $lowest_score = 999;
    foreach ($known_brands as $key => $value) {
        foreach ($value as $val) {
            $score = levenshtein($in, $val);
            if ($score < $lowest_score) {
                $lowest_score = $score;
                $champion = $key;
            }
        }
    }
    return $champion;
}

var_dump(guess("gstar"));
var_dump(guess("G-STAR"));
var_dump(guess("Jacky"));
var_dump(guess("Brandon"));

string(10) "G-STAR RAW"
string(10) "G-STAR RAW"
string(7) "Brand-Y"
string(7) "Brand-X"

答案 2 :(得分:0)

$txt = preg_replace('~\bg-star(?: raw)?\b~i', 'G-STAR RAW', $txt);

答案 3 :(得分:0)

如果您只需要替换上面的字符串,则可以使用以下内容:

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

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