PHP regex查找单词(即使是双字母),然后替换它


PHP regex find word (even with double letters) then replace it

我使用PHP创建一个字符串过滤器。我需要用其他单词替换一些单词所以我使用str_replace()函数,像这样:

$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy   = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);
// echo -> "You should eat pizza, beer, and ice cream every day.";

到目前为止都很好,但是我需要替换单词,即使它们包含像这样的几个字母:

$phrase  = "You should eat fruuits, vegetaaables, and fiiibeeer every day.";

我发现这个例子删除了字符串中的双字母:

$string = preg_replace('/('w)'1+/', '$1', $phrase);

但是如果我把这个例子应用到我的字符串中,所有双字母的单词都会被改变…例如,"Google"将变成"Google",我不希望这样。

有什么想法吗?谢谢!

我会这样做

$phrase  = "You should eat suck, sck, and suuucky every day.";
$healthy = 's+u*c+k+';
$yummy = 'luck';
$newphrase = preg_replace('/' . $healthy . '/', $yummy, $phrase);
echo $newphrase;
输出:

You should eat luck, luck, and lucky every day.

+是量词,表示前面的一个或多个字符。*是一个零或更多的量词,这意味着该字符不必出现,但如果出现,该字符的任何数量都可以出现。

演示:https://regex101.com/r/sN5sZ6/1

也与ass字边界应该使用,因为你不想取代class等https://regex101.com/r/oM4wY1/2有点成为一个曲折的道路虽然..

工作示例

$word =array('fiber', 'milk', 'nuts'); // words to scan for
$phrase = "You should eat fibeeer, nuuuuts, and milkkk every day."; //phrase
$filter = array(); // array of dynamicly generated filters
foreach($word as $name){ // loop for filter generating
    $temp = str_split($name);
    $temp = implode('{1,}', $temp). '{1,}';
    $filter[$name] = $temp;
}

$phraseTable = explode(' ', $phrase); // getting phrase into an array
foreach($phraseTable as &$data){ // scanning phrase
    foreach($filter as $name => $value){
         if(  preg_match( '/'.$value.'[,.]?/', $data)){
             $data = $name;
    }  
    } 
}       
$phraseScanned = implode(' ', $phraseTable); // imploding formatted phrase
echo $phraseScanned;  // echo result

如果你想要特定的单词,那么你可以在preg_replace中使用多个模式。

对于你的例子,你可以使用多个模式,像这样:

$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$patterns = array("/fru+its/", "/vegeta+bles/", "/fi+be+r/");
$yummy   = array("pizza", "beer", "ice cream");
$newphrase = preg_replace($patterns, $yummy, $phrase);

如果您只想检测fruits, vegetablesfiber,那么您可以使用:

$patterns = array("f+r+u+i+t+s+", "v+e+g+e+t+a+b+l+e+s+", "f+i+b+e+r+");
<<p> Regex演示/strong>

IdeOne代码示例