我正在尝试创建一个正则表达式来替换一个单词。例如,我想用“猫”代替“狗”这个词。但我不想取代教条或者robodog。
我现在正在使用它:
<?php
$str = preg_replace("/dog\W/", "cat", $str);
?>
但我有很多问题。首先,如果我使用“i”来表示我不关心大写,则替换字符串不使用相同的大小写。 此外,“狗吃”成为“cateats”(没有空间)。
任何人都可以帮助我找到可靠的替换单词的解决方案,包括以下情况: “狗” - &gt; “猫” “一只狗,一只羊” - &gt; “一只猫,一只羊” “我的狗” - &gt; “我的猫” 和狗成为猫等
答案 0 :(得分:2)
最简单的方法是创建两个正则表达式并将它们作为数组传递给preg_replace
:
preg_replace(array("/\bdog\b/", "/\bDog\b/"), array("cat", "Cat"), "Dog eats dog");
返回:
"Cat eats cat"
答案 1 :(得分:0)
单独使用正则表达式可能无法实现,但您可以使用preg_replace_callback。
为了幻觉,请考虑以下发现并替换巴黎:
$pairs = array(
'dog' => 'cat',
'sheep' => 'goat'
);
使用以下测试字符串:
$tests = array(
'a dog',
'Dog darn good',
'a dog, a sheep',
'My DOG'
);
要仅匹配整个单词,请使用单词边界标记:
\bdog\b
这将匹配“dog”但不匹配“dogbert”或“wardog”等。
如果要匹配多个单词 - 不要在循环中使用正则表达式,请使用一个正则表达式替代。这段代码:
$pattern = '/\b' . implode('|', array_keys($pairs)) . '\b/i';
会产生这个正则表达式:
/\bdog|sheep\b/i
目的是哪个套件。
回调需要返回给定匹配的替换。这是一个回调示例:
$callback = function($matches) use ($pairs) {
$match = $matches[0];
$lc = strtolower($match);
$replace = $pairs[$lc];
$chars = str_split($match);
foreach($chars as $i => $char) {
if (ctype_upper($char) && isset($replace[$i])) {
$replace[$i] = strtoupper($replace[$i]);
}
}
return $replace;
};
这将使匹配小写在$pairs
数组中找到它,然后循环匹配中的所有字符,并仅为替换中的大写字符更改大小写。
使用以下测试代码:
foreach($tests as $test) {
echo "\n> $test\n";
$test = preg_replace_callback($pattern, $callback, $test);
echo " $test";
}
结果是:
> a dog
a cat
> Dog darn good
Cat darn good
> a dog, a sheep
a cat, a goat
> My DOG
My CAT
答案 2 :(得分:0)
试试此代码
$pattern = '/(\\s)*Dog(\\s)*/';
echo $string = 'a Dog, a sheep, or Dog';
echo "<br>";
preg_match_all($pattern, $string, $matches);
print_r($matches);
echo "<br>";
echo preg_replace_callback(
$pattern,
function($match) {
//print_r($match);
return str_replace('Dog', 'Cat', $match[0]);
},
$string);