仅当';It’这是唯一的单词


Preg_replace only when it's the only word

当字符串只存在于一个单词之外时,我该如何预存字符串?

示例:进来的是:

  1. G-star Raw
  2. G-STAR
  3. G-星

我想把它们都改成G-STAR RAW:

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

但我也得到了:

G-STAR RAW RAW

它还取代了示例1中的G-Star。我该如何替换,说只有当它正好是那个字符串时,它才能工作,而不是当那个字符串中有更多单词时?

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

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

preg_replace()中,它看起来像:

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

还要注意regex中添加的i选项,以忽略区分大小写。

编码板示例输出:

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

更新添加了一个前导'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);

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

模糊匹配

也许包含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"