我在尝试旋转文章时需要帮助。我希望找到文本并替换同义文本,同时保持案例相同。
例如,我有一个字典:
您好|喜|你好| howd'y
我需要找到所有hello
并替换为hi
,howdy
或howd'y
中的任何一个。
假设我有一句话:
大家好!当我说你好的时候,你不应该跟我问好吗?
在我的操作之后它将是:
嗨,伙计们!当我说你好的时候,难道你不应该对我这么说吗?
在这里,我输了这个案子。我想保持它!它应该是:
嗨,伙计们!当我说HOWDY时,你不应该对我这么说吗?
我的字典大小约为5000行
你好|你好|你好|怎么走?来 工资|盈利|工资
不应该|不应该 ...
答案 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?