Foros del Web » Programando para Internet » PHP »

Como encuentro una cadena no especificada?

Estas en el tema de Como encuentro una cadena no especificada? en el foro de PHP en Foros del Web. Hola saludos a todos. Estaba aburriendome un rato y me he puesto a jugar a las magics otra vez. El caso es ke hay un ...
  #1 (permalink)  
Antiguo 15/07/2012, 19:06
 
Fecha de Ingreso: junio-2010
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 3
Pregunta Como encuentro una cadena no especificada?

Hola saludos a todos.

Estaba aburriendome un rato y me he puesto a jugar a las magics otra vez. El caso es ke hay un programa ke tiene todas las cartas pero en inglés y hay una web comercial en la ke salen todas con los textos en castellano.

Estoy haciendo un programita bastante tonto para descargarme todas las imagenes de las cartas en español para poder implementarlas en el juego pero hay un par de datos ke no consigo y después de un buen rato buscando mi problema específico sin suerte me he decidido a postear mi duda.

El código es este:

<?php

$edicion[1] = "avr";
$edicion[2] = "dka";
$edicion[3] = "isd";
$edicion[4] = "nph";
$edicion[5] = "mbs";
$edicion[6] = "som";
$edicion[7] = "roe";
$edicion[8] = "wwk";
$edicion[9]= "zen";
$edicion[10] = "arb";
$edicion[11] = "cfx";
$edicion[12] = "ala";
$edicion[13] = "eve";
$edicion[14] = "shm";
$edicion[15] = "mt";
$edicion[16] = "lw";
$edicion[17] = "fut";
$edicion[18] = "pc";
$edicion[19] = "ts";
$edicion[20] = "tsts";
$edicion[21] = "cs";
$edicion[22] = "ai";
$edicion[23] = "ia";
$edicion[24] = "di";
$edicion[25] = "gp";
$edicion[26] = "rav";
$edicion[27] = "sok";
$edicion[28] = "bok";
$edicion[29] = "chk";
$edicion[30] = "5dn";
$edicion[31] = "ds";
$edicion[32] = "mi";
$edicion[33] = "sc";
$edicion[34] = "le";
$edicion[35] = "on";
$edicion[36] = "ju";
$edicion[37] = "tr";
$edicion[38] = "od";
$edicion[39] = "ap";
$edicion[40] = "ps";
$edicion[41] = "in";
$edicion[42] = "pr";
$edicion[43] = "ne";
$edicion[44] = "mm";
$edicion[45] = "ud";
$edicion[46] = "ul";
$edicion[47] = "us";
$edicion[48] = "ex";
$edicion[49] = "sh";
$edicion[50] = "tp";
$edicion[51] = "wl";
$edicion[52] = "vi";
$edicion[53] = "mr";
$edicion[54] = "hl";
$edicion[55] = "m13";
$edicion[56] = "m12";
$edicion[57] = "m11";
$edicion[58] = "m10";
$edicion[59] = "10e";
$edicion[60] = "9e";
$edicion[61] = "8e";
$edicion[62] = "7e";
$edicion[63] = "6e";
$edicion[64] = "5e";
$edicion[65] = "4e";
$edicion[66] = "4eb";
$edicion[67] = "salvat";
$edicion[68] = "pc2";
$edicion[69] = "cmd";

ini_set('max_execution_time', 259200);

Foreach ($edicion as $clave)
{
mkdir($clave, 0777);
$Numero = 1;
while ($Numero != 245)
{
$ArchivoRemoto = "http://magiccards.info/scans/es/$clave/$Numero.jpg";
$ArchivoLocal = "$clave/$Numero.jpg";
$datos = file_get_contents($ArchivoRemoto);
file_put_contents($ArchivoLocal, $datos);
$Numero = $Numero + 1;
}
}






?>

Este código funciona y me guarda todas las cartas en sus correspondientes carpetas pero las guarda nombrándolas con números ya ke asi es como están subidas al servidor. El nombre de la carta en cuestión está en el codigo de la página html y el problema ke tengo es ke no consigo localizar justo ese sitio en el código. Son un monton de cartas y no kiero ir descargándolas una por una ni renombrándolas después. El nombre aparece en una parte del código y esa parte es tal ke así:

<img src="http://magiccards.info/images/en.gif" alt="English"
width="16" height="11" class="flag2">
<a href="/avr/en/1.html">Angel of Glory's Rise</a><br>

El nombre de la carta ke yo kiero guardar en una variable es Angels of Glory's Rise pero no encuentro una función ke me buske una cadena entre dos cadenas. Usease, si yo kiero Guardar en una variable Angel of Glory's Rise debería haber una función ke me permita localizar el texto ke haya entre <a href="/avr/en/1.html"> y </a><br>

E visto un monton de ejemplos en los ke pone como empezar a buscar a partir de o hasta, pero creo ke no me sirve porke yo kiero ke buske desde un punto hasta otro sin tener ke especificar un numero intermedio de caracteres porke no todas las cartas tienen el mismo nombre. No se, estoy perdido :P
  #2 (permalink)  
Antiguo 16/07/2012, 01:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Como encuentro una cadena no especificada?

Cita:
E visto un monton de ejemplos en los ke pone como empezar a buscar a partir de o hasta, pero creo ke no me sirve porke yo kiero ke buske desde un punto hasta otro sin tener ke especificar un numero intermedio de caracteres porke no todas las cartas tienen el mismo nombre. No se, estoy perdido :P
Si eres capaz de leer la linea!!? (seguro que hay una forma).

Luego las funciones que tratan strings te permitiran separar el titulo de las etiquetas html.


Manual
Cita:
strip_tags — Retira las etiquetas HTML y PHP de un string
Cita:
string strip_tags ( string $str [, string $allowable_tags ] )
Esta función intenta devolver un string con todos los bytes NUL y las etiquetas HTML y PHP retirados de un str dado. Se utiliza la misma máquina de estado de retirado de etiquetas que la función fgetss().
Código PHP:
Ver original
  1. <?php
  2. $text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
  3. echo strip_tags($text);
  4. echo "\n";
  5.  
  6. // Permite <p> y <a>
  7. echo strip_tags($text, '<p><a>');
  8. ?>

El resultado del ejemplo sería:

Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>

Si no es mucho pedir comenta como localizas y lees la linea de fichero remoto.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 16/07/2012 a las 01:14
  #3 (permalink)  
Antiguo 16/07/2012, 09:46
 
Fecha de Ingreso: junio-2010
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: Como encuentro una cadena no especificada?

Voy a intentar expresarlo lo mas claramente posible, a ver si puedo :D

Ahora mismo capturo el código de una página html y lo guardo en una variable. Esto lo hago porke kiero encontrar una cadena dentro de ese código. Una vez tengo dentro de la variable $Codigo el contenido en el cual kiero encontrar la cadena en cuestión debo proceder a buscarla. El problema ke veo (a parte de mi falta de conocimientos :P) es ke tengo ke encontrar la cadena en un fragmento de entre todo el código por lo ke supongo ke primero tengo ke encontrar una referencia en el código para localizar el fragmento. A continuación pongo el codigo con el ke guardo tooooooooooodo el contenido en la variable $Codigo:

Código PHP:
Ver original
  1. $Url_Nombre="http://magiccards.info/avr/es/1.html";
  2. $fo = fopen("$Url_Nombre","r");
  3. while (!feof($fo)) {
  4. $Codigo .= fgets($fo, 4096);
  5. }
  6. fclose ($fo);
  7. print("<textarea name='mi_area' cols='100' rows='20'>$Codigo</textarea>");

Esto imprime en pantalla el código como comprobante de ke lo ha capturado bien. De entre todo ese código yo kiero localizar un nombre ke no puedo especificar porke como esto se va a hacer automáticamente el programa no sabe los nombres de todas las cartas por lo ke tengo ke localizar un ente desconocido dentro de algo y ese algo es este fragmento:

Código HTML:
Ver original
  1. <br><u><b>Idiomas:</b></u><br>
  2.        
  3.        
  4.          
  5.             <img src="http://magiccards.info/images/en.gif" alt="English"
  6.              width="16" height="11" class="flag2">
  7.               <a href="/avr/en/1.html">Angel of Glory's Rise</a><br>

La función ke me enseñaste funciona pero me devolvería todo el texto de todo el contenido y yo solo kiero localizar el texto ke hay dentro de las etiketas de enlace ke en este caso es Angel of Glory's Rise. Este sería el fragmento de codigo en el ke debo buscar porke no hay otro igual en todo el código.

Otra opción ke se me ha ocurrido es sacar el nombre de las etiketas <tittle></tittle> ya ke tambien sale ahi aunke sale seguido del nombre de la edición.

¿Como podría localizar y guardar en una variable el texto ke se encuentre entre las etiketas <tittle> y </tittle> ademas de borrar un numero indefinido de dígitos para eliminar el nombre de la edición y asi guardar en una variable únicamente el nombre de la carta sin mas?

Seguro ke es mas fácil de lo ke me imagino pero esto de buscar cadenas no especificadas se me está atragantando.

Saludos y gracias por la contestación!!
  #4 (permalink)  
Antiguo 16/07/2012, 13:03
 
Fecha de Ingreso: junio-2010
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 3
Mensaje Respuesta: Como encuentro una cadena no especificada?

Hola de nuevo :D

1- Estoy probando cosas y he resumido bastaaaaaaaaaaaaaaante el problema. Capturo el código de una página html y lo meto en una variable (hasta aki todo bien):

Código PHP:
Ver original
  1. $Url_Nombre ="http://magiccards.info/zen/en/165.html";
  2. $fo = fopen("$Url_Nombre","r");
  3. $Codigo = fgets($fo);
  4. while (!feof($fo)) {
  5. $Codigo .= fgets($fo, 4096);
  6. }
  7. fclose ($fo);

2- Como todo el código ahora es una cadena y está dentro de la variable $Codigo puedo usar las funciones para los strings, en este caso voy a usar substr para empezar a leer la cadena DESDE una posición concreta con lo ke consigo ke el primer texto ke aparezca en pantalla sea el nombre ke estoy buscando:

Código PHP:
Ver original
  1. $CodigoSinCabecera = substr("$Codigo", 212);

3- Este es el código una vez realizado el proceso (no lo voy a poner entero porke es mucho y es tontería pero voy a poner un cachito representativo para ke se vea ke es lo ke kiero hacer ya ke una vez veais el codigo podreis ver ke lo primero ke sale es el nombre ke busco (en este caso Harrow) y lo ke kiero hacer es borrar absolutamente todo lo ke hay a partir del primer paréntesis (paréntesis inclusive):

Código HTML:
Ver original
  1. Harrow (Zendikar)</title>
  2.   <style type="text/css">
  3.    <!--
  4.    body {background: #fafafa url(http://magiccards.info/images/bg.gif) repeat-x;margin: 1em 1.5em;}
  5.    body,td,th {font: 0.9em/1.2em Verdana;color: #444;}
  6.    th {text-align: left; font-weight: bold;}
  7.    p {margin: 0.5em 0;}
  8.    a {color: #4666BC;}
  9.    a:hover {color: #333;background-color: #ff0;}
  10.    a:active {text-decoration: none;}
  11.    a:visited {color: #283C71;}
  12.    li.legal {color: #216728;}
  13.    li.restricted {color: #B98420;}
  14.    li.banned {color: #672121;}
  15.    li.reserve {color: #4F55CC;}
  16.    p.ctext {background-color: #fff;padding: 4px;}
  17.    p.otext {background-color: #fff;padding: 4px;}
  18.    div.oo {margin-left: 0em; padding: 0.5em 0 0 0; border: 1px solid #bbb; font-size: 75%;line-height: 100%;}
  19.    div.oo span {padding: 4px;}... ... ... hay bastante mas código.

Una vez solucionado eso, simplemente uso la funcion para eliminar los espacios y ya podría meter el nombre directamente en una variable.

Duda! ¿Cómo borro todo a partir del primer paréntesis? ¿Es eso posible? ¿Alguna otra sugerencia?

A continuación dejo el código completo por si kereis probarlo. Os imprimirá dentro de un textarea el contenido de la página html:

Código PHP:
Ver original
  1. $Url_Nombre ="http://magiccards.info/zen/en/165.html";
  2. $fo = fopen("$Url_Nombre","r");
  3. $Codigo = fgets($fo);
  4. while (!feof($fo)) {
  5. $Codigo .= fgets($fo, 4096);
  6. }
  7. fclose ($fo);
  8. $CodigoSinCabecera = substr("$Codigo", 212);
  9. print("<textarea name='mi_area' cols='100' rows='20'>$CodigoSinCabecera</textarea>");
  #5 (permalink)  
Antiguo 17/07/2012, 06:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Como encuentro una cadena no especificada?

Gracias por el apaorte!!!

Cita:
Duda! ¿Cómo borro todo a partir del primer paréntesis? ¿Es eso posible? ¿Alguna otra sugerencia?
Usa strpos para localizar el parentesis, con esa posicion usa substr para leer de 0 a la posición del parentesis.

Otra forma de trabajarlo seria usar file en sustitución de fopen, file crea un array con las lineas del fichero, con lo que te será facil localizar la linea del titulo (la que empieza por <title>) y luego solo tendras que eliminar los tags (strip_tags) y luego lo mismo que te he dicho para el parentesis. (Simpre que los ficheros html que vas a leer esten minimamente estructurados.... si no lo estan usa tu solución)

Otra quizas la mas directa usas strpos para localizar "<title>" sumas a la posicion 7 para localizar el primer caracter del titulo real, strpos para localizar "</title>" con esas dos posiciones usas substr y luego aplicas la solucion del parentesis....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 17/07/2012 a las 07:09
  #6 (permalink)  
Antiguo 17/07/2012, 09:27
 
Fecha de Ingreso: junio-2010
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: Como encuentro una cadena no especificada?

Encontré una solución con explode y me guarda bastante bien pero no todo.

Tengo ke revisar las razones por las ke no me guarda todo y lo ke se me ocurre es ke como el proceso es automático cabe la posibilidad de ke no todas las páginas tengan la misma estructura.

Me toca aprender a manejar los errores ke te tira el programa (los cuales en el código ke os puse me los paso por el... de los...)

Tambén kiero hacerle una interfaz para no ver una página en blanco cargando constantemente y la verdad es ke algo ke en principio parecía bastante sencillo se esta complicando a la par ke avanzo :P

Si un día acabo este programa y no keda en el olvido volveré a este post y lo posteare :D

Muchas gracias por tu interés!! Un saludo a todos.

PD: ¿Para lanzar una aplicación creada en php se puede poner un boton con el cual empezar el bucle y otro con el ke pararlo, o tiene ke ser todo con formularios?
  #7 (permalink)  
Antiguo 17/07/2012, 10:50
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Como encuentro una cadena no especificada?

Cita:
Encontré una solución con explode y me guarda bastante bien pero no todo.
Si, si aplicas el explode sobre el titulo, usando "(" como marca en el primer elemento del array deberias tener el titulo que buscabas....

Puedes hacerlo des de un boton lanzando un bucle javascirpt o llamando un php que tenga el bucle dentro o incluso des de un link al .php.

Como es un trabajo que creo que lo haces mas para aprender que para nada mas, ahi te va un reto: Para mi la forma mas elegante seria llamar con ajax un .php pero que ajax vaya mostrando el progreso, de manera grafica, porcentual o listando los titulos que se vayan guardando.

No es necesario un formulario.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 17/07/2012 a las 10:58
  #8 (permalink)  
Antiguo 17/07/2012, 11:11
 
Fecha de Ingreso: junio-2010
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: Como encuentro una cadena no especificada?

Pues la verdad es ke si ke es un reto ya ke no tengo ni pajolera idea de ajax. Empecé un curso de programación web y uno de los libros ke tengo (un libro no mu grande) es precisamente de ajax pero no llegué a esa parte del curso y el libro sigue ahi muerto de risa.

Por lo ke se, es lo mas dinamico ke hay por lo ke se puede visualizar absolutamente todo lo ke se esta haciendo sin cambiar de página (no se si estoy del todo en lo cierto)

Mi idea para la interfaz es bastante básica, un log dentro de un textarea y dependiendo de lo ke kiera visualizar le paso las variables por url al programa y listo. Asi tengo algo de control sobre los datos ke estoy manejando. Pero ya te digo ke ajax se me escapa un pokillo.

Etiquetas: encuentro, html, imagenes, variables, cadenas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:24.