De pas respecter les majuscules dans une chaine

WRInaute impliqué
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.
 
WRInaute discret
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.
 
WRInaute impliqué
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
 
WRInaute impliqué
Le problème est résolu avec ceci, mais les apostrophes ne passent pas non plus.

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

Le tiret n'est pas nécessaire, non ?
 
WRInaute accro
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/
 
WRInaute impliqué
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.
 
WRInaute impliqué
Ton code remplace les apostrophes par des tirets. Comment faire pour que ca ne soit pas le cas ?

Merci
 
WRInaute impliqué
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>';
	}
}
 
WRInaute discret
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.
 
WRInaute impliqué
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 ?
 
WRInaute accro
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.
 
Discussions similaires
Haut