当一个字符串只存在于那个单词中时,我怎么能preg_replace?
实施例: 进来是:
我想将它们全部更改为G-STAR RAW:
$x = preg_replace('/(G-star)\b/', 'G-STAR RAW', $x);`
但我也得到了:
G-STAR RAW RAW
它还在示例nr 1中替换了G-Star。我怎么做替换,说它只能在它正好是那个字符串时工作,而不是当字符串中有更多的单词?
答案 0 :(得分:2)
尝试添加可选匹配项,以查找文本中的现有raw
:
(G-star(?: raw)?)\b
在preg_replace()
中,它看起来像是:
$x = preg_replace('/\b(G-star(?: raw)?)\b/i', 'G-STAR RAW', $x);
另请注意正则表达式中添加的i
选项可忽略区分大小写。
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
距离的算法更有用?
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);
最后一个表达式将匹配任何以大写字母开头的字符串,后跟一个破折号( - ),后跟小写和大写字符的任意组合,后面可能跟一个或多个字符,最后一个结尾处有大写和小写字符的任意组合。