Поиск строки и замена на ту же строку регистра - PullRequest
0 голосов
/ 05 июля 2010

Мне нужна помощь при попытке раскрутить статьи.Я хочу найти текст и заменить синонимичный текст, не меняя регистр.

Например, у меня есть словарь типа:

hello | hi | howdy | howd'y

Мне нужно найти все hello и заменить на любой из hi, howdy или howd'y.

Предположим, у меня есть предложение:

Привет, ребята!Разве ты не должен поздороваться со мной, когда я скажу тебе ПРИВЕТ?

После моей операции это будет что-то вроде:

привет, ребята!Разве вы не должны говорить мне «привет», когда я говорю «привет»?

Здесь я проиграл дело.Я хочу сохранить это!На самом деле должно быть:

Привет, ребята!Разве вы не должны говорить мне «привет», когда я говорю «ХОУДО»?

Размер моего словаря составляет около 5000 строк

привет | привет | привет | привет!| прийти
зарплаты | заработок | заработная плата
не должно | не должно * не должно
...

Ответы [ 4 ]

1 голос
/ 05 июля 2010

Я бы предложил использовать preg_replace_callback с функцией обратного вызова, которая проверяет совпавшее слово, чтобы увидеть, если (а) первая буква не заглавная, или (б) первая буква является единственной заглавной буквой, или (в) первая буква не единственная заглавная буква, а затем замените ее на правильно измененное слово замены.

0 голосов
/ 05 июля 2010

Вы можете попробовать следующую функцию.Имейте в виду, что он будет работать только со строками ASCII, поскольку он использует некоторые из полезных свойств прописных и строчных букв ASCII .Тем не менее, он должен быть очень быстрым:

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:

Как заменить регистр без учета регистра на LHS при сохранении регистрана RHS?

0 голосов
/ 05 июля 2010

Вот решение для сохранения регистра (верхний, нижний или заглавные):

// 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);
}
0 голосов
/ 05 июля 2010

Вы можете найти свою строку и сделать два теста:

$outputString = 'hi';
if ( $foundString == ucfirst($foundString) ) {
   $outputString = ucfirst($outputString);
} else if ( $foundString == strtoupper($foundString) ) {
   $outputString = strtoupper($outputString);
} else {
   // do not modify string's case
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...