Problema con for y str_replace

  • Autor Autor OLMID
  • Fecha de inicio Fecha de inicio
OLMID

OLMID

Gamma
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola compañeros

Tengo un foro dedicado a cine y los usuarios publican sobre alguna peli y colocan los datos (director, guion, reparto, género, etc)
Hice un plugin que recoge el/los géneros en una variable para colocarle a cada uno un enlace hacia un archivo php que recopila todas las películas de ese género

El código que hace el reemplazo es este:

PHP:
$generos = 'Terror,Thriller,Drama,Drama psicológico,Surrealismo';
$genero = explode(',', $generos);
$cuenta = count($genero);
for ($i = 0; $i < $cuenta; $i++){
$post_message = str_replace($genero[$i], '<a href="recopilaciones.php?gen='.$genero[$i].'">'.$genero[$i].'</a>', $post_message); 
}

Funciona correctamente excepto cuando tenemos, como en el ejemplo de arriba, "Drama y Drama psicológico", entonces lo que hace es reemplazar las 2 palabras "Drama"

Necesito que solamente reemplace la primera ocurrencia, lo he intentado con preg_replace pero no he sido capaz de hacerlo funcionar

Un saludo 🙂
 
Última edición:
Prueba con este:

PHP:
$generos = 'Terror,Thriller,Drama,Drama psicológico,Surrealismo'; 
$genero = explode(',', $generos); 


for ($i=0; $i <count($genero) ; $i++) { 
	$post_message = '<a href="recopilaciones.php?gen='.$genero[$i].'">'.$genero[$i].'</a>'.'<br>';
}
 
En el código original te falta la s en la línea 2 pero el compañero Son Lux ya te lo dio corregido, lo único que creo que le faltaría es agregar un punto para no perder lo anterior:

PHP:
$post_message .= '<a href="recopilaciones.php?gen='.$genero[$i].'">'.$genero[$i].'</a>'.'<br>';

De lo contrario $post_message solo se quedaría con una línea correspondiente a Surrealismo
 
Prueba con este:

PHP:
$generos = 'Terror,Thriller,Drama,Drama psicológico,Surrealismo'; 
$genero = explode(',', $generos); 


for ($i=0; $i <count($genero) ; $i++) { 
	$post_message = '<a rel="nofollow" href="recopilaciones.php?gen='.$genero[$i].'">'.$genero[$i].'</a>'.'<br>';
}

Muchas gracias por responder

$post_message es una variable global que alberga todo el texto del post, por eso uso str_replace para reemplazar los géneros por enlaces justo donde están

Con ese código que has dejado lo que sucede es que se elimina todo el texto del post y solo deja un género
Poniendo un punto antes del signo igual (como indica el compañero Programarte), se mantiene todo el texto y al final del post coloca una lista con ltodos los géneros

El código que puse arriba funciona perfectamente (la s de generos la quité sin querer al ponerlo aquí xD)
Ahora mismo, si un post tiene como generos "Comedia, Romance,Comedia Romántica", pues se reemplaza Comedia, Romance y Comedia, y si la palabra Comedia está en otra parte del post como por ejemplo en la sinopsis, también lo reemplaza
Lo que necesito es que solo se reemplace la primera coincidencia, así se reemplazaría correctamente Comedia Romántica

Espero haberme explicado bien, me cuesta xD

Un saludo 🙂
 
Muchas gracias por responder

$post_message es una variable global que alberga todo el texto del post, por eso uso str_replace para reemplazar los géneros por enlaces justo donde están

Con ese código que has dejado lo que sucede es que se elimina todo el texto del post y solo deja un género
Poniendo un punto antes del signo igual (como indica el compañero Programarte), se mantiene todo el texto y al final del post coloca una lista con ltodos los géneros

El código que puse arriba funciona perfectamente (la s de generos la quité sin querer al ponerlo aquí xD)
Ahora mismo, si un post tiene como generos "Comedia, Romance,Comedia Romántica", pues se reemplaza Comedia, Romance y Comedia, y si la palabra Comedia está en otra parte del post como por ejemplo en la sinopsis, también lo reemplaza
Lo que necesito es que solo se reemplace la primera coincidencia, así se reemplazaría correctamente Comedia Romántica

Espero haberme explicado bien, me cuesta xD

Un saludo 🙂

Ya no entendí si ya te funciona bien o no. Es que hablas de otras partes del post como la sinopsis pero en el ejemplo en la variable géneros solo tienes los puros géneros valga la redundancia, o sea cómo se mezcla con la sinopsis
 
Pues seguramente no sepa explicarme bien xD

Cuando se crea un Tema en el foro (igual que aquí), el contenido del mensaje se guarda en la BD como html
En la variable $post_message está ese contenido, por ejemplo:
HTML:
<img src="http://i67.tinypic.com/157ep8h.jpg" border="0" /><br />
<br />
Título original: Get Over It<br />
Año: 2001<br />
País: Estados Unidos<br />
Director: Tommy O´Haver<br />
Guion: R. Lee Fleming Jr.<br />
<br />
Género: Comedia, Romance, Comedia romántica, Adolescencia<br />
<br />
Reparto: Kirsten Dunst, Ben Foster, Sisqó, Martin Short, Melissa Sagemiller, Shane West, Colin Hanks, Swoosie Kurtz, Carmen Electra, Ed Begley Jr., Zoe Saldana, Mila Kunis, Christopher Jacot<br />
<br />
Sinopsis<br />
Comedia interpretada por Ben Foster en el papel de un joven que intentará cualquier cosa para recuperar a su ex-novia, Allison (Melissa Sagemiller), que le acaba de dejar; se apuntará a una academia, representará un musical, e intentará triunfar para conquistarla de nuevo.<br />

El plugin extrae los géneros y los reemplaza cuando se carga la página
PHP:
preg_match('|Género(.*?)<br />|is', $post_message, $gen); //extraemos los géneros
$quitar = array(": ",":",".",", ");
$poner = array("","",",",",");
$generos = str_replace($quitar, $poner, $gen[1]); //si hay puntos los cambiamos pos comas y quitamos los espacios
$genero = explode(',', $generos);

//A continuación hice un for para reemplazarlos
$cuenta = count($genero);
for ($i = 0; $i < $cuenta; $i++){
$post_message = str_replace($genero[$i], '<a href="recopilaciones.php?gen='.$genero[$i].'">'.$genero[$i].'</a>', $post_message); 
}

En este ejemplo hay 4 géneros (Comedia,Romance,Comedia romántica,Adolescencia)
str_replace reemplaza todas las ocurrencias siguiendo el orden que están los array, en primer lugar reemplaza Comedia en las 3 ocurrencias que hay en el post, luego Romance, Comedia romántica no la encuentra porque ya ha sido reemplazada la palabra Comedia, y por último Adolescencia

Lo que necesito es que solo reemplace la primera ocurrencia y no todas las que encuentra, he probado con preg_replace que sí tiene el parámetro limit pero no he sabido hacerlo funcionar

Seguramente todo eso se puede hacer de otra forma, pero es como se me ocurrió xD

Un saludo y gracias 😉

- - - Actualizado - - -

Ya está solucionado, :sonrisaabierta:

He usado preg_split en vez de explode, así:
PHP:
$genero = preg_split('/,/', $generos);

Y en vez de usar str_replace he usado preg_replace con límite 1
PHP:
$post_message = str_replace('/'.$genero[$i].'/', '<a href="recopilaciones.php?gen='.$genero[$i].'">'.$genero[$i].'</a>', $post_message, 1);

Ahora solo reemplaza la primera coincidencia que encuentra de cada género, y es justo lo que necesitaba

Muchas gracias a todos

Un saludo 🙂
 
Atrás
Arriba