Foros del Web » Programando para Internet » PHP »

Buscar substring en cadena de texto.

Estas en el tema de Buscar substring en cadena de texto. en el foro de PHP en Foros del Web. Tengo la variable $html que contiene todo el html de una pagina, y necesito sacar los datos que hay dentro de ciertos enlaces. Los mismos ...
  #1 (permalink)  
Antiguo 02/09/2012, 22:42
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 6 meses
Puntos: 1
Buscar substring en cadena de texto.

Tengo la variable $html que contiene todo el html de una pagina, y necesito sacar los datos que hay dentro de ciertos enlaces. Los mismos tienen el siguiente formato:

<a href="00000/?ref=m"> Noticia.</a>

Lo que yo estoy haciendo (y no funciona) es:
preg_match_all("#<a href=\"([0-9]+)/?ref=m\">([^<]+)</a>#is",$html,$datos);

y luego datos deberia ser un array en el que esten las coincidencias.

es decir:
$datos[0][0] = <a href="00000/?ref=m"> Noticia.</a>
$datos[1][0] = 00000
$datos[2][0] = Noticia.

$datos[0][1] =<a href="11111/?ref=m"> Noticia 2.</a>
$datos[1][1] = 11111
$datos[1][1] = Noticia 2.

etc..

Esto deberia ser asi sino me equivoco pero no esta funcionando.

Directamente no copia nada. Le hago un count($datos) y me devuelve 0 , alguien tiene idea donde esta el error?
  #2 (permalink)  
Antiguo 03/09/2012, 02:02
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Buscar substring en cadena de texto.

Supongo que lo que te interesa es noticia. Puedes hacerlo con strpos y substr. Con strpos buscas <a href="00000/?ref=m"> y te dará la posición de esa cadena. Te dará de posición el "<" justo donde empieza. Supongamos posición 107.

Luego tendrás que sumarle a esa posición los caracteres de "<a href="00000/?ref=m">" ya que eso ya lo tienes y no te interesa, lo puedes hacer con strleng. Esto se lo sumas a posicion.

Así tienes la posición donde inicia noticia pero también necesitas saber donde termina.
Buscas </a> a partir de la posición anterior y lo mismo que antes. Solo que ahora no necesitas sumar nada, la posición que te da es en la que termina noticia.

Ahora haces un substr desde la posicion a hasta la posicion b y listos.

En código (lo estoy haciendo de memoria igual pongo algo mal):
Código PHP:
$html 'Blabla bla bla bla<a href="00000/?ref=m">noticia</a>blabla bla bla';
//Obtenemos la posición de inicio
$posicion_inicio =  strpos($html'<a href="00000/?ref=m">');
//Sumamos los caracteres de la cadena
$posicion_inicio $posicion_inicio strlen('<a href="00000/?ref=m">');

//Retiramos todo lo que va antes de lo que nos interesa
$html substr($posicion_inicio);

//Ahora el texto que nos interesa está al inicio en la posición 0. Nos falta saber cuanto mide
$posicion_final strpos($html'</a>'); //Si puedes añadir algo más específico que <a/> añadiendo algo de lo que viene después mejor
//A posición final no necesitamos sumarle ni restarle nada. Nos indica justo la posición que queremos.
$cadena substr(0$posicion_final);
$echo $cadena//devuelve 'noticia'

//Por si vamos a querer escanear el siguiente <a href="00000/?ref=m"> retiramos todo hasta ahora.
$html substr(0$posicion_final); //esto ya no contiene 'noticia'
//es un poco redundante con lo de arriba pero así queda más claro 
Creo que es así, aver si lo puse bien.

Última edición por alyciashape; 03/09/2012 a las 04:53
  #3 (permalink)  
Antiguo 03/09/2012, 07:23
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Buscar substring en cadena de texto.

Cita:
Iniciado por alyciashape Ver Mensaje
Supongo que lo que te interesa es noticia. Puedes hacerlo con strpos y substr. Con strpos buscas <a href="00000/?ref=m"> y te dará la posición de esa cadena. Te dará de posición el "<" justo donde empieza. Supongamos posición 107.

Luego tendrás que sumarle a esa posición los caracteres de "<a href="00000/?ref=m">" ya que eso ya lo tienes y no te interesa, lo puedes hacer con strleng. Esto se lo sumas a posicion.

Así tienes la posición donde inicia noticia pero también necesitas saber donde termina.
Buscas </a> a partir de la posición anterior y lo mismo que antes. Solo que ahora no necesitas sumar nada, la posición que te da es en la que termina noticia.

Ahora haces un substr desde la posicion a hasta la posicion b y listos.

En código (lo estoy haciendo de memoria igual pongo algo mal):
Código PHP:
$html 'Blabla bla bla bla<a href="00000/?ref=m">noticia</a>blabla bla bla';
//Obtenemos la posición de inicio
$posicion_inicio =  strpos($html'<a href="00000/?ref=m">');
//Sumamos los caracteres de la cadena
$posicion_inicio $posicion_inicio strlen('<a href="00000/?ref=m">');

//Retiramos todo lo que va antes de lo que nos interesa
$html substr($posicion_inicio);

//Ahora el texto que nos interesa está al inicio en la posición 0. Nos falta saber cuanto mide
$posicion_final strpos($html'</a>'); //Si puedes añadir algo más específico que <a/> añadiendo algo de lo que viene después mejor
//A posición final no necesitamos sumarle ni restarle nada. Nos indica justo la posición que queremos.
$cadena substr(0$posicion_final);
$echo $cadena//devuelve 'noticia'

//Por si vamos a querer escanear el siguiente <a href="00000/?ref=m"> retiramos todo hasta ahora.
$html substr(0$posicion_final); //esto ya no contiene 'noticia'
//es un poco redundante con lo de arriba pero así queda más claro 
Creo que es así, aver si lo puse bien.
Gracias, asi como lo pusiste funciona. De todas maneras estoy tratando de hacerlo con el preg_match_all ya que me hago todo en una sola linea de codigo y es mas eficiente.

Ya probe que funciona porque anteriormente lo usaba para copiar datos de otras webs pero ahora por alguna razon que no logro descubrir no funciona.
  #4 (permalink)  
Antiguo 03/09/2012, 07:29
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Buscar substring en cadena de texto.

Yo nunca acabé de entender muy bien como funciona preg_match_all de hecho acabo de leer la función en php.net y no me queda nada claro.
  #5 (permalink)  
Antiguo 03/09/2012, 07:34
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Buscar substring en cadena de texto.

Cita:
Iniciado por alyciashape Ver Mensaje
Yo nunca acabé de entender muy bien como funciona preg_match_all de hecho acabo de leer la función en php.net y no me queda nada claro.
Lo que hace el preg_match_all es dado un string te busca las coincidencias (escritas como expresiones regulares) y las pone en un array. Es mucho mas practico y eficiente que hacerlo con el codigo anterior (que igual funciona y me saca del apuro).

El problema es que directamente no encuentra ninguna coincidencia por lo que algo debo estar escribiendo mal.
  #6 (permalink)  
Antiguo 03/09/2012, 08:34
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Buscar substring en cadena de texto.

Claro...pero tu lo que quieres buscar es un string que varía no siempre es el mismo, por lo tanto no vas a poder usar preg_match_all. Si es que te he entendido bien su funcionamiento.
  #7 (permalink)  
Antiguo 03/09/2012, 10:42
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Buscar substring en cadena de texto.

Cita:
Iniciado por alyciashape Ver Mensaje
Claro...pero tu lo que quieres buscar es un string que varía no siempre es el mismo, por lo tanto no vas a poder usar preg_match_all. Si es que te he entendido bien su funcionamiento.
Claro, en ese momento entran en juego las expresiones regulares. Fijate que el codigo es el siguiente:

preg_match_all("#<a href=\"([0-9]+)/?ref=m\">([^<]+)</a>#is",$code,$num);

([0-9]+) Eso es una expresion regular que copia cualquier numero y deja de guardar cuando aparece algo diferente a un numero.

([^<]+) Y esto copia cualquier caracter hasta que encuentra un "<" .

Entonces lo que encuentra en esas dos expresiones regulares se guardan en $num

$num[0][0] = todo el <a></a>
$num[1][0] = todo el numero
$num[2][0] = todo el texto.

Etiquetas: html, substring, 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 06:24.