Autor Tema: [AYUDA] Problema con BBCode SPOILER  (Leído 2189 veces)

Desconectado Masato

  • PHPero Avanzado
  • ****
  • Mensajes: 480
  • Karma: 12
  • Sexo: Masculino
  • <?php echo "Solo quiero aprender php"; ?>
    • Ver Perfil
    • Masato Design!
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #30 en: 28 de Octubre de 2009, 17:55:19 pm »
Sinceramente no puedo encontrar el error :S

Comunidad PHPeros

Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #30 en: 28 de Octubre de 2009, 17:55:19 pm »

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #31 en: 28 de Octubre de 2009, 19:34:54 pm »
aparte de k $i=$count deberia ser $i<$count no veo errores

Desconectado Masato

  • PHPero Avanzado
  • ****
  • Mensajes: 480
  • Karma: 12
  • Sexo: Masculino
  • <?php echo "Solo quiero aprender php"; ?>
    • Ver Perfil
    • Masato Design!
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #32 en: 29 de Octubre de 2009, 01:17:01 am »
Cambiandole el $i<=$count a $i<$count es lo mismo :S

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #33 en: 29 de Octubre de 2009, 15:32:44 pm »
Hola,

Para empezar en el for, como bien decís, no es <= sino que es <.
Ademas tienes que restarle 1 a la variable $count, y por ultimo, no puedes usar += con strings, eso solo funciona con números.
Este código si que te funcionará:

$texto str_replace(&#39;[/spoiler]&#39;, &#39;</div>&#39;, $texto);
$explode explode(&#39;[spoiler]&#39;, $texto);
$count count($explode)-1;
$texto = &#39;&#39;;
for($i=0;$i<$count;$i++) {
$texto $texto.$explode[$i].&#39;<input type="submit" onclick="capa(&#39;.$i.&#39;)" value="Contenido Oculto">
<div id="capa&#39;.$i.&#39;" style="border:solid #6699FF 1px;background:#B2E0F0; width:480px; display:none;">&#39;;
}
$texto $texto.$explode[$i];


Sin embargo no lo veo como una buena opción, yo me plantearía seguir estudiando lo de ereg, que para mi me parece una mejor solución.
Esta es mas enrevesada, pero como ya te digo, va a funcionar.
Como más de uno diría, esto mas que una solución es un workaround :P

Saludos
« Última modificación: 29 de Octubre de 2009, 15:34:17 pm por TLX »
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #34 en: 29 de Octubre de 2009, 16:06:22 pm »
Si le restas uno a count, y encima en el if usas $i<$count no recorres todo el array.

No me di cuenta del +=, me confundi con js, en php es .=

$texto = str_replace('[/spoiler]', '</div>', $texto);
$explode = explode('[spoiler]', $texto);
$count = count($explode);
$texto = '';
for($i=0;$i<$count;$i++) {
$texto .= $explode[$i].'<input type="submit" onclick="capa('.$i.')" value="Contenido Oculto">
<div id="capa'.$i.'" style="border:solid #6699FF 1px;background:#B2E0F0; width:480px; display:none;">';
}

Creo que deberia ir... Y se que es mucho liarse, pero no se me ocurre como acerlo...

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #35 en: 29 de Octubre de 2009, 16:16:01 pm »
Si le restas uno a count, y encima en el if usas $i<$count no recorres todo el array.

Creo que deberia ir... Y se que es mucho liarse, pero no se me ocurre como acerlo...

Si pruebas el código que te he dejado verás que funciona a la perfección.
El código que acabas de poner es casi igual al anterior, sigue añadiendo un spoiler de más que no contiene nada.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #36 en: 29 de Octubre de 2009, 16:36:04 pm »
No se yo k decirte...

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #37 en: 29 de Octubre de 2009, 16:44:08 pm »
No entiendo por qué.
Ejecuta ambos códigos, mira los resultados de ambos y a partir de ellos elabora una conclusión que luego podrás plasmar en tu siguiente mensaje.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #38 en: 29 de Octubre de 2009, 20:44:41 pm »
si, cierto...

Pero se te ocurre como hacerlo con eregi?

A mi se me ocurre una idea, pero es muy rebuscada y es mas de JS, en vez de usar numeros ($i) con DOM se accede al nodo padre (donde estan el div y el boton) y se saca el div y se muestra/oculta, algo asi:


$texto 
eregi_replace(&#39;[spoiler](.*)[/spoiler]&#39;, &#39;<div><input type="submit" onclick="capa(this.parentNode.getElementsByTagName(\&#39;div\&#39;)[0];);" value="Contenido Oculto"><br><div style="border:solid #6699FF 1px;background:#B2E0F0; width:480px; display:none;">&#39;, $texto);


Y el JS, que habria que modificarlo un pco:

Código: [Seleccionar]
function capa(div) {
div.style.display = (div.style.display=='block' ? 'none' : 'block');
}

No se si funcionara, pero creo que deberia de ir bien. Lo unico es el
  • del onclick, que no se si en un onclick se puede (aunque en buena logica deberia poderse)


Salu2

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #39 en: 29 de Octubre de 2009, 20:54:26 pm »
Bueno aunque fuese así el problema seguiría siendo el mismo.
Que si hay varios [spoiler][/spoiler] solo coge el primer [spoiler] y el ultimo [/spoiler] y los de en medio los deja dentro, con lo que no solucionamos nada.
El problema está en la expresión regular.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #40 en: 29 de Octubre de 2009, 21:48:20 pm »
lo que adelantamos asi es que funcione bien, porque antes habia errores (o eso tenia entendido)

Por cierto, el php es:

$texto 
eregi_replace(&#39;\\[spoiler\\](.*)\\[/spoiler\\]&#39;, &#39;<div><input type="submit" onclick="capa(this.parentNode.getElementsByTagName(\&#39;div\&#39;)[0]);" value="Contenido Oculto"><br><div style="border:solid #6699FF 1px;background:#B2E0F0; width:480px; display:none;">\\1</div></div>&#39;, $texto);


Se me ocurre que con while si encuentra spoiler, aga otra vez, pero ... :S

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #41 en: 29 de Octubre de 2009, 21:56:09 pm »
Vamos a ver, que estamos mezclando códigos y nos estamos liando.

El código que dije que tenia errores era el de str_replace. Solucioné sus errores aquí: http://www.phperos.net/foro/index.php/topic,4223.msg27766.html#msg27766 y ese código ya funciona perfectamente.

Otra cosa es el código que usaba ereg, que tambien contenía errores y solucioné con este código:
$capa 1;
$texto eregi_replace("\\[spoiler\\](.*)\\[/spoiler\\]", &#39;<input type="submit" onclick="capa(&#39;.$capa.&#39;)" value="Contenido Oculto">
<div id="capa&#39;.$capa++.&#39;" style="border:solid #6699FF 1px;background:#B2E0F0; width:480px; display:none;">
\\
1
</div>&#39;, $texto);


Pero este código tiene la expresión regular mal, y a partir de ahí deriva un segundo error que es el que intentamos solucionar.
El error es el siguiente:
Si la variable $texto contiene esto:
[spoiler]Holaaaaaa[/spoiler]
Adiossssss
[spoiler]Segundo holaaaaaaa[/spoiler]

El resultado despues de haber pasado ese código sería este:
<input type="submit" onclick="capa(0)" value="Contenido Oculto">
<div id="capa0" style="border:solid #6699FF 1px;background:#B2E0F0; width:480px; display:none;">
Holaaaaaa[/spoiler]
Adiossssss
[spoiler]Segundo holaaaaaaa
</div>

Como ves solo sustituye el primer [spoiler] y el ultimo [/spoiler] y el resto lo deja tal cual.
Eso es lo que queremos solucionar.

Lo que tenemos que saber es si es un problema con la expresión regular, o simplemente es mejor usar el otro código, pero los códigos que tu estas aportando ahora mismo son equivalentes a ese, que como digo, tiene esa falla.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #42 en: 29 de Octubre de 2009, 21:57:48 pm »
hsta donde yo entendi, eso de $capa y tal tiene el problema de que todos quedan con la misma ID, perdon si me equivoque...

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #43 en: 29 de Octubre de 2009, 22:02:57 pm »
Ese no es el problema.
En primer lugar estoy hablando del código de ereg (para no confundirnos jeje).
El código de ereg solo pone una capa, porque no esta metida en ningún bucle.

La solución entonces sería meter el ereg_replace en un bucle, pero primero tendremos que editar la expresión regular para que recorra los tags [spoiler] y [/spoiler] y no coja solo el primero y el último. No se si me explico, es un poco difícil de decir jeje

Saludos!
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[AYUDA] Problema con BBCode SPOILER
« Respuesta #44 en: 29 de Octubre de 2009, 23:55:58 pm »
Si el tema es que coge primero y ultimo y no los del medio... podemos acer asi:


while(eregi(&#39;[spoiler]&#39;, $texto) && eregi(&#39;[/spoiler]&#39;, $texto)) {
$texto eregi_replace(&#39;\\[spoiler\\](.*)\\[/spoiler\\]&#39;, &#39;<div><input type="submit" onclick="capa(this.parentNode.getElementsByTagName(\&#39;div\&#39;)[0]);" value="Contenido Oculto"><br><div style="border:solid #6699FF 1px;background:#B2E0F0; width:480px; display:none;">\\1</div></div>&#39;, $texto);
}


Podria ser, no?

Salu2