0 votes

Trouver une chaîne et la remplacer par la même chaîne en conservant la casse

J'ai besoin d'aide pour essayer de réécrire des articles. Je veux trouver du texte et remplacer des mots synonymes tout en conservant la même casse.

Par exemple, j'ai un dictionnaire comme suit :

hello|hi|howdy|howd'y

Je dois trouver tous les hello et les remplacer par l'un des mots suivants : hi, howdy ou howd'y.

Supposons que j'ai une phrase :

Hello, les gars! Ne devriez-vous pas me dire bonjour lorsque je vous dis HELLO?

Après mon opération, cela ressemblera à quelque chose comme :

hi, les gars! Ne devriez-vous pas me dire howd'y lorsque je dis howdy?

Ici, j'ai perdu la casse. Je veux la conserver ! En réalité, cela devrait être :

Hi, les gars! Ne devriez-vous pas me dire howd'y lorsque je dis HOWDY?

Mon dictionnaire compte environ 5000 lignes

hello|hi|howdy|howd'y go|come
salaires|gains|salaire
ne devrait pas|ne devrait pas
...

1voto

Amber Points 159296

Je suggérerais d'utiliser preg_replace_callback avec une fonction de rappel qui examine le mot correspondant pour voir si (a) la première lettre n'est pas en majuscule, ou (b) si la première lettre est la seule lettre en majuscule, ou (c) si la première lettre n'est pas la seule lettre en majuscule, et ensuite remplacer par le mot de remplacement correctement modifié selon les besoins.

0voto

hsz Points 46509

Vous pouvez trouver votre chaîne et effectuer deux tests :

$outputString = 'hi';
if ( $foundString == ucfirst($foundString) ) {
   $outputString = ucfirst($outputString);
} else if ( $foundString == strtoupper($foundString) ) {
   $outputString = strtoupper($outputString);
} else {
   // ne modifiez pas la casse de la chaîne
}

0voto

casablanca Points 41814

Voici une solution pour conserver la casse (majuscule, minuscule ou en capitales) :

// Suppose que $replace est déjà en minuscules
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';

// Trouver le mot dans tous les cas où il apparaît
while (($pos = stripos($input, $find)) !== false) {
  // Extraire le mot dans son cas actuel
  $found = substr($input, $pos, strlen($find));

  // Remplacer toutes les occurrences de ce cas
  $input = str_replace($found, convertCase($found, $replace), $input);
}

0voto

Mike Points 11170

Vous pourriez essayer la fonction suivante. Soyez conscient que cela ne fonctionnera qu'avec des chaînes ASCII, car elle utilise certaines des propriétés utiles des lettres majuscules et minuscules ASCII. Cependant, cela devrait être extrêmement rapide:

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

Ceci est ma version PHP de la petite fonction Perl intelligente:

Comment puis-je effectuer une substitution insensible à la casse sur le côté gauche tout en préservant la casse sur le côté droit?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X