用preg_replace替换大写和非大写字符串

时间:2016-12-29 16:55:11

标签: php regex preg-replace

我正在开展一个项目,其中我有一个包含内容的字符串,例如$content,以及包含字词(没有大写字母)的数组,例如$rewrites

我想要实现的目标,例如:

$content包含一个包含以下文字的字符串:'苹果是苹果的复数形式,苹果很美味。

$rewrites包含一个包含以下数据的数组:' apple',' blueberry'。

现在我想创建一个功能,用其他东西取代所有苹果,例如覆盆子。但是,在字符串中,有苹果,它不会被preg_replace取代。苹果应该用覆盆子代替(提到大写R)。

我尝试了不同的方法和模式,但它不起作用。

目前我有以下代码

foreach($rewrites as $rewrite){
      if(sp_match_string($rewrite->name, $content) && !in_array($rewrite->name, $spins) && $rewrite->name != $key){
        /* Replace the found parameter in the text */
        $content = str_replace($rewrite->name, $key, $content);

        /* Register the spin */
        $spins[] = $key;
      }
    }

function sp_match_string($needle, $haystack) {

 if (preg_match("/\b$needle\b/i", $haystack)) {
   return true;
 }
return false;

}

1 个答案:

答案 0 :(得分:1)

我是通过动态构建各种替换案例来实现的。

$content = 'Apples is the plural of apple, apples are delicious';

$rewrites = array(
    array('apple', 'blueberry'),
    array('apple', 'raspberry')
);

echo "$content\n";
foreach ($rewrites as $rule) {
    $source = $rule[0];
    $target = $rule[1];

    // word and Word
    $find = array($source, ucfirst($source));
    $replace = array($target, ucfirst($target));

    // add plurals for source
    if (preg_match('/y$/', $source)) {
        $find[] = preg_replace('/y$/', 'ies', $source);
    } else {
        $find[] = $source . 's';
    }
    $find[] = ucfirst(end($find));

    // add plurals for target
    if (preg_match('/y$/', $target)) {
        $replace[] = preg_replace('/y$/', 'ies', $target);
    } else {
        $replace[] = $target . 's';
    }
    $replace[] = ucfirst(end($replace));

    // pad with regex
    foreach ($find as $i => $word) {
        $find[$i] = '/\b' . preg_quote($word, '/') . '\b/';
    }

    echo preg_replace($find, $replace, $content) . "\n";
}

输出:

Apples is the plural of apple, apples are delicious
Blueberries is the plural of blueberry, blueberries are delicious
Raspberries is the plural of raspberry, raspberries are delicious