查找字符串并替换为相同的大小写字符串

时间:2010-07-05 18:20:23

标签: php string search replace

我在尝试旋转文章时需要帮助。我希望找到文本并替换同义文本,同时保持案例相同。

例如,我有一个字典:

  

您好|喜|你好| howd'y

我需要找到所有hello并替换为hihowdyhowd'y中的任何一个。

假设我有一句话:

  

大家好!当我说你好的时候,你不应该跟我问好吗?

在我的操作之后它将是:

  嗨,伙计们!当我说你好的时候,难道你不应该对我这么说吗?

在这里,我输了这个案子。我想保持它!它应该是:

  

嗨,伙计们!当我说HOWDY时,你不应该对我这么说吗?

我的字典大小约为5000行

  

你好|你好|你好|怎么走?来   工资|盈利|工资
  不应该|不应该   ...

4 个答案:

答案 0 :(得分:1)

我建议使用带有回调函数的preg_replace_callback来检查匹配的单词,看看(a)第一个字母是否大写,或者(b)第一个字母是唯一的大写字母,或者( c)第一个字母不是唯一的大写字母,然后根据需要用适当修改的替换字替换。

答案 1 :(得分:0)

你可以找到你的字符串并进行两项测试:

$outputString = 'hi';
if ( $foundString == ucfirst($foundString) ) {
   $outputString = ucfirst($outputString);
} else if ( $foundString == strtoupper($foundString) ) {
   $outputString = strtoupper($outputString);
} else {
   // do not modify string's case
}

答案 2 :(得分:0)

这是保留案例(上限,下限或大写)的解决方案:

// Assumes $replace is already lowercase
function convertCase($find, $replace) {
  if (ctype_upper($find) === true)
    return strtoupper($replace);
  else if (ctype_upper($find[0]) === true)
    return ucfirst($replace);
  else
    return $replace;
}

$find = 'hello';
$replace = 'hi';

// Find the word in all cases that it occurs in
while (($pos = stripos($input, $find)) !== false) {
  // Extract the word in its current case
  $found = substr($input, $pos, strlen($find));

  // Replace all occurrences of this case
  $input = str_replace($found, convertCase($found, $replace), $input);
}

答案 3 :(得分:0)

您可以尝试以下功能。请注意,它仅适用于ASCII字符串,因为它使用了一些有用的properties of ASCII upper and lower case letters。但是,它应该非常快:

function preserve_case($old, $new) {
    $mask = strtoupper($old) ^ $old;
    return strtoupper($new) | $mask .
        str_repeat(substr($mask, -1), strlen($new) - strlen($old) );
}

echo preserve_case('Upper', 'lowercase');
// Lowercase

echo preserve_case('HELLO', 'howdy');
// HOWDY

echo preserve_case('lower case', 'UPPER CASE');
// upper case

echo preserve_case('HELLO', "howd'y");
// HOWD'Y

这是我的PHP版本的聪明的小perl函数:

How do I substitute case insensitively on the LHS while preserving case on the RHS?