繁体   English   中英

PHP正则表达式找到单词(甚至带有双字母),然后将其替换

[英]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”将变为“ Gogle”,而我不希望那样。

有任何想法吗 ? 谢谢!

我会做这样的事情

$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 Kinda却变成了一条蜿蜒的路。

如果您想要特定的单词,则可以在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);

如果您只想检测fruitsvegetablesfiber ,则可以使用:

$patterns = array("f+r+u+i+t+s+", "v+e+g+e+t+a+b+l+e+s+", "f+i+b+e+r+");

正则表达式演示

IdeOne代码示例

工作实例

$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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM