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)+/', '', $phrase);
但是如果我将这个例子应用到我的字符串中,所有带有双字母的单词都会被改变...例如 "Google" 将变成 "Gogle" 而我不希望那样。
有什么想法吗?谢谢!
如果您想要特定的词,那么您可以在 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
、vegetables
和 fiber
,那么您可以使用:
$patterns = array("f+r+u+i+t+s+", "v+e+g+e+t+a+b+l+e+s+", "f+i+b+e+r+");
我会做这样的事情
$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
我正在使用 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)+/', '', $phrase);
但是如果我将这个例子应用到我的字符串中,所有带有双字母的单词都会被改变...例如 "Google" 将变成 "Gogle" 而我不希望那样。
有什么想法吗?谢谢!
如果您想要特定的词,那么您可以在 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
、vegetables
和 fiber
,那么您可以使用:
$patterns = array("f+r+u+i+t+s+", "v+e+g+e+t+a+b+l+e+s+", "f+i+b+e+r+");
我会做这样的事情
$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