正则表达式在保持大写的同时替换单词

时间:2014-03-06 09:46:35

标签: php regex

我正在尝试创建一个正则表达式来替换一个单词。例如,我想用“猫”代替“狗”这个词。但我不想取代教条或者robodog。

我现在正在使用它:

<?php 
$str = preg_replace("/dog\W/", "cat", $str);
?>

但我有很多问题。首先,如果我使用“i”来表示我不关心大写,则替换字符串不使用相同的大小写。 此外,“狗吃”成为“cateats”(没有空间)。

任何人都可以帮助我找到可靠的替换单词的解决方案,包括以下情况:     “狗” - &gt; “猫”     “一只狗,一只羊” - &gt; “一只猫,一只羊”     “我的狗” - &gt; “我的猫” 和狗成为猫等

3 个答案:

答案 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

单独使用正则表达式可能无法实现,但您可以使用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);