当字符串只存在于一个单词之外时,我该如何预存字符串?
示例:进来的是:
- G-star Raw
- G-STAR
- 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"