De pas respecter les majuscules dans une chaine

Bonjour, j'ai un petit soucis. En effet dans cette ligne ci dessus, un mot est mis en gras respectant à la lettre les majuscules

Code:
$country_name = str_replace($_POST['keyword'], '<b>'.$_POST['keyword'].'</b>', $rs['name']);

Admettons que $rs['name'] = 'Texte';

Si $_POST['keyword'] = Texte

Texte devient Texte

Si $_POST['keyword'] = TEXTE

TEXTE reste TEXTE

Si $_POST['keyword'] = texte

texte reste texte

Comment faire pour ne pas tenir des compte des majuscules et minuscule pour le mot soit toujours mis en gras ?

Merci pour votre aide.
 
Le tiret du 6 c'est l'underscore ?
Tu cherche à faire exactement ?
Si c'est pour un traitement similaire entre - et _ faire une recherche sur les deux. str_replace accepte des array, donc tu peux mettre les deux possibilités. Y a les regex aussi, mais tant qu'on peux éviter, c'est mieux.
 
Le problème se situe sur mon script de recherche de villes. Si je tape par exemple "chateauneuf-sur-loire" il va bien trouver le resultat de la bdd car dans la bdd la ville est écrit avec les tirets.

Par contre si j'écris chateauneuf sur loire, la il ne trouve pas la ville. Or j'aimerais qu'avec ou sans tirets, la ville soit trouvée.

Script : http://ad49eb1cf7.url-de-test.ws/test5/

code :

Code:
// connexion bdd

if (isset($_REQUEST['query'])) {

    $query = $_REQUEST['query'];
	
    $principalquery = $mysqli->query("SELECT * FROM cities WHERE name LIKE '%{$query}%' OR postal_code LIKE '%{$query}%'");
	$array = array();
   
while ($row = $principalquery->fetch_assoc()) {
	
        $array[] = array (
            'label' => $row['name'].', '.$row['postal_code'],
            'value' => $row['name'],
        );
    }

    echo json_encode ($array);
}

je n'arrive pas à résoudre le problème
 
Le problème est résolu avec ceci, mais les apostrophes ne passent pas non plus.

$vowels = array(" ", "-");
$query = str_replace($vowels, "-", $_REQUEST['query']);
 
Ajoute l'apostrophe dans ta liste :
$vowels = array(" ", "-", "'");

Le tiret n'est pas nécessaire, non ?
 
Ce serait plus malin d'enregistrer la version "slugifiée" en base de données:

PHP:
<span class="syntaxdefault">function slug</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">)<br />{<br /></span><span class="syntaxdefault">    $transliterator </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Transliterator</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">createFromRules</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"::Latin-ASCII; ::Lower; [^[:L:][:N:]]+ > '-';"</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    return trim</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$transliterator</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">transliterate</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> </span><span class="syntaxstring">'-'</span><span class="syntaxkeyword">);<br />}</span><span class="syntaxdefault"></span>
Src: https://www.matthecat.com/supprimer-les-accents-dune-chaine-en-php/
 
Merci beaucoup, ca m'aide beaucoup, mais les apostrophes ne passent toujours pas.

Par exemple il ne reconnait pas la ville de "pont l'abbé". Il la reconnait jusqu’à "pont l" mais pas plus loin.
 
Ton code remplace les apostrophes par des tirets. Comment faire pour que ca ne soit pas le cas ?

Merci
 
Le problème se situe sur plusieurs type de nom de ville. Si je tape Saint Etienne, il va bien trouver Saint-Etienne dans la base de donnée

Mais sur les exemples suivant ca ne fonctionne pas :

La grande-motte (comment faire pour que ca fonctionne en ne mettant que des espaces entre les mots ? )

Pont l'Abbé (comment faire pour qu'une apostrophe fonctionne ?)

Code:
function slug($str)
{
    $transliterator = Transliterator::createFromRules("::Latin-ASCII; ::Lower; [^[:L:][:N:]]+ > '-';");
    return trim($transliterator->transliterate($str), '-');
}

function connect() {
	return new PDO('mysql:host=localhost;dbname=xxx', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}

$pdo = connect();

$keyword = slug($_POST['keyword']);

$sql = "SELECT * FROM cities WHERE name LIKE '%".$keyword."%' OR postal_code LIKE '%".$keyword."%' ORDER BY name ASC LIMIT 0, 10";

echo "SELECT * FROM cities WHERE name LIKE '%{$keyword}%' OR postal_code LIKE '%{$keyword}%' ORDER BY name ASC LIMIT 0, 10";

$query = $pdo->prepare($sql);
$query->bindParam(':keyword', $keyword, PDO::PARAM_STR);
$query->execute();
$list = $query->fetchAll();

if(empty($list)) { 

	echo 'Aucun code postal ne correspond à votre saisie !';

}else{

	foreach ($list as $rs) {
		
		$name = preg_replace('.' . preg_quote($_POST['keyword']) . '.ui', '<b>\0</b>', $rs['name']);
		
		echo '<li '.$style.' onclick="set_item(\''.str_replace("'", "\'", $rs['name']).'\')">'.$name.' ['.$rs['postal_code'].']</li>';
	}
}
 
Comme te l'as suggéré Spout il vaudrait mieux enregistrer le titre dans une version "nettoyée".
Et quand tu fais une recherche, tu applique la même fonction de nettoyage sur ton texte de recherche et tu compare les deux versions nettoyées.
 
Oui mais du coup cela m'affichera des villes dans apostrophes ni espace, non ?

Pont-l'abbé sera enregistré comme ceci : Pont L Abbe

La grande-motte comme ceci : La grande motte

Bref comme remettre les accents, tirets et espaces lors de l'affichage ?
 
Non, avoir 2 champs:
- name: Pont l'Abbé
- slug: pont-l-abbe

Code:
SELECT * FROM cities WHERE slug=:slug

C'est très courant cette façon de faire.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut