Reemplazar cadena de texto case-insensitive

KoRMuZ

Buenos días, aunque no se si el título será suficientemente indicativo.

Quiero poner en negrita una cadena, en un cuadro de sugerencias, según la búsqueda que se haga.

Por ejemplo: Supongamos que tengo una categoría que es "Coches nuevos" y otra "Coches viejos".

Si en el buscador alguien pone "coche", con la primera c minúscula, quiero que se ponga en negrita en las categorías la palabra "Coche" pero con la primera c mayúscula.

Si una persona pone "che", quiero que se ponga en negrita "che" en las categorías, pero sin mayusculizar nada.

Si uso el str_ireplace, siempre aparece con la misma mayúsculidad que en la búsqueda, o sea, pone "coche" en minúscula. Si uso el ucwords y buscamos "che", pone coChe, así que tampoco me vale.

He pensado en usar str_pos para hacerlo, buscar la cadena e inyectarle unos <b> </b> delante y detrás de las posiciones, pero no me parece la forma más correcta.

Hay alguna opción más viable que esta?

Amazon

Y si usas http://php.net/manual/en/function.strtoupper.php en las 2 cadenas para comprobar? (porque intuyo que será php, si no, seguro que hay una función igual en el lenguaje que uses)

1 1 respuesta
KoRMuZ

#2 El problema es distinguir entre si tengo que mostrar una cadena capitalizada o toda en minúscula despues.

PD: Sí, es php. se me olvidó ponerlo.

1 respuesta
Amazon

#3 creo que entiendo tu problema pero no por qué lo tienes

¿No se supone que seleccionas las categorías que coinciden con que tengan "che"? ¿Por qué no aplicas el <b></b> directamente al nombre de la categoría y no al nombre construido con tu "che"? No sé si me explico bien xD

La cosa es, no utilices las cadenas que te devuelve ireplace directamente, porque te pasará lo de "coChe", sino usa las cadenas originales para mostrar el nombre de la categoría (aunque uses ireplace para buscar)

1 respuesta
KoRMuZ

#4 si, eso es lo que digo de inyectarle el <b> </b> en medio de la cadena, si hacerlo con un strpos o hay algun otro método.

1 respuesta
Amazon

#5 RegEx

Es decir, expresiones regulares, pero te deseo suerte si quieres montar en ese barco xD

1 respuesta
KoRMuZ

#6 gl xD. He descartado las expresiones regulares, al final lo voy a montar con substr a ver que sale. xD

PiradoIV

http://es1.php.net/ucfirst a ver si esa te vale

1 1 respuesta
KoRMuZ

Ahora mismo tengo esta burrada

$npname = strtolower($pname);
        $nstring = strtolower($string);
        $pos = strpos($npname,$nstring);
        if ($pos)
            $newname = substr($pname,0,$pos-(1))."<b>".substr($pname,$pos,strlen($string))."</b>".substr($pname,$pos+strlen($string));

Después del almuerzo seguiré y miraré eso #8

elkaoD

Yo pienso que RegEx es lo mejor. Se inventaron para estas cosas, no le des vueltas con el substring y usa un RegEx replace.

Con el modo /i creo hace la búsqueda case-insensitive y sólo tienes que capturar el grupo y reemplazarlo por <b> (grupo)</b>.

EDIT: ah vale, acabo de ver lo de reemplazar la mayúscula. Entonces sí, a manubrio.

1
M

http://php.net/manual/es/function.stripos.php

1
Lecherito

No sé, pero seguro que puedes meterle un $ucfirst como dijeron al hacer el replace con $preg_replace

LOc0

Yo para estas cosas siempre recomiendo http://php.net/manual/es/function.preg-replace-callback.php pero claro, si te dan alergia las RegEX...

spoiler

Salu2 ;)

2

Usuarios habituales