Foros del Web » Programando para Internet » PHP »

subcadena comprendida entre tags html

Estas en el tema de subcadena comprendida entre tags html en el foro de PHP en Foros del Web. Quiero seleccionar algo que esta entre dos etiquetas: Cita: <font><img SRC="textures/textures_title.jpg"></font> Entonces empiezo con esto: Cita: $patron = "/<font>(.*)<\/font>/"; Pero como puede especificar solo la ...
  #1 (permalink)  
Antiguo 04/04/2010, 16:13
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
subcadena comprendida entre tags html

Quiero seleccionar algo que esta entre dos etiquetas:

Cita:
<font><img SRC="textures/textures_title.jpg"></font>
Entonces empiezo con esto:
Cita:
$patron = "/<font>(.*)<\/font>/";
Pero como puede especificar solo la subcadena "_title.jpg" dentro del parentesis?

Asi como lo tengo, estoy seleccionando todo entre font y font. Y yo lo que necesito es un comodin antes de _title.jpg
  #2 (permalink)  
Antiguo 04/04/2010, 17:25
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: subcadena comprendida entre tags html

Tu patrón tiene un fallo. Por ejemplo:

<font>hola</font></font> devolverá hola</font>. También <font>hola</font><font>hola2</font> devolverá hola</font><font>hola2 por la forma en la que busca el patrón.

Me imagino que tienes que usar un patrón más complicado.


De todas maneras, para tu pregunta: sacando el resultado de tu patrón:

<img SRC="textures/textures_title.jpg">

entoces puedes buscar algo como

"/(.*)_title.jpg/"
Esto devolverá <img SRC="textures/textures_

Ya ir mas a lo que quieres te tendría que preguntar más cosas, como para qué sirve, y si lo que hay entre <font> y </font> es siempre un img de el estilo que muestras.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #3 (permalink)  
Antiguo 04/04/2010, 17:31
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

En verdad, quiero eliminar esa imagen. Solo la primera, no la de los demas fonts. Por eso uso el filtro _title.jpg , porque cada pagina tiene solo una imagen que se llama xxxxx_title.jpg , y es esa la que necesito eliminar, recorriendo las paginas.

Aparte, necesito la misma logica para eliminar los titulos:
<TITLE> editing objects </TITLE>

Es decir, todo lo comprendido entre <title> y </title>

Gracias por la ayuda!.

QUe tal esto?

Cita:
$patterns = "/<font>(.*)_title.jpg<\/font>/i";

preg_replace($patterns, "", $string);

Última edición por mayid; 04/04/2010 a las 17:39
  #4 (permalink)  
Antiguo 05/04/2010, 10:49
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Encontre un manual simple, y con eso pude componer dos busquedas, que funcionan:

Cita:
$patron = "/<title>.*<\/title>/i";
$hallazgo = preg_match($patron, $texto);
echo $hallazgo;

$patron = '/<img src=".*_title.jpg">/i';
$hallazgo = preg_match($patron, $texto);
echo $hallazgo;
Mi duda es que estan seleccionando realmente. Solo obtengo ceros y unos. Pero quisiera poder imprimir lo que tengo seleccionado. Como?
  #5 (permalink)  
Antiguo 05/04/2010, 10:51
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: subcadena comprendida entre tags html

Para recibir los datos específicos debes encerrarlo entre paréntesis los datos que quieres ver exactamente y con var_dump mira como se muestra la información en la variable.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 05/04/2010, 10:53
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: subcadena comprendida entre tags html

mayid, además si leyeras el manual...

...te darías cuenta que las capturas se almacenan en una variable, osea en el tercer argumento de la función preg_match()
http://php.net/preg_match
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 05/04/2010, 10:53
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: subcadena comprendida entre tags html

bueno debes usar el tercer parametro de preg_match y encerrar las capturas con ( )
Código PHP:
Ver original
  1. $patron = "/<title>(.*)<\/title>/i";
  2. $hallazgo = preg_match($patron, $texto, $matches);
  3. print_r($matches);
__________________
More about me...
~ @rhyudek1
~ Github
  #8 (permalink)  
Antiguo 05/04/2010, 10:59
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Gracias. Ya probé lo del manual!

Para la primera cadena, me devuelve un numero. Para la segunda, una imagen en pantalla.

Pero voy a confiar en los parentesis.

$patron = "/(<title>.*<\/title>)/i";

$patron = '/(<img src=".*_title.jpg">)/i';
  #9 (permalink)  
Antiguo 05/04/2010, 11:06
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: subcadena comprendida entre tags html

Mira bien el ejemplo que te indicó Hidek1, si el dato que tu quieres espcifico es el que está entre title debes usarlo entre las etiquetas.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 05/04/2010, 11:10
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Si, si. Lo veo bien.

Estoy queriendo hacer dos cosas. O tres. Con diferentes capturas.

Primero: modificar todo, incluidos los wrappers: "/<title>.*<\/title>/i"

Segundo (y aparte): modificar solo el contenido: "/<title>(.*)<\/title>/i"

Tercero: modificar solo los wrappers. Pero como se hace esto?
$patron = '/(<font size="4">).Previous:.*(<\/font>)/i';

En el ejemplo que pongo, necesito cambiar los FONT por otro html, que sea valido. Lo que va luego de Previous es un comodin. Mismo, puse uno antes por las dudas de que haya algun espacio. Para casos similares use explode, pero para este necesito expresinoes regulares. Mas ayuda please?
  #11 (permalink)  
Antiguo 05/04/2010, 11:24
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Creo que esto funciona. Disculpen la ansiedad! Ayer busque mucho sobre como reemplazar subcadena y siempre aparece solo el metodo de strpos... o el de explode. :(

Cita:
$patterns = array();
$patterns[0] = '/(<font size="4">).Previous:.*<\/font>/i';
$patterns[1] = '/<font size="4">.Previous:.*(<\/font>)/i';
$replacements = array();
$replacements[0] = '<span style="float: left">';
$replacements[1] = '</span>';
$hallazgo = preg_replace($patterns, $replacements, $texto);
Gracias a todos, por las buenas respuestas, y por ser TAN rapidos (al responder ya me aparecían respuestas nuevas! Que vertigo).
  #12 (permalink)  
Antiguo 05/04/2010, 12:29
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Sigo! Ando trabado con esta selección:

'/<font size="4">Previous.*(<\/font>)/i'

Para alguna pagina funciona. Pero para otras no.

La cadena que recorre es esta:
<font size="4">Previous: Animation</font>

Pero parece que no funciona cuando hay un salto de linea, asi:

<font size="4">Previous:
Animation</font>

A esto lo deduzco de revisar el codigo fuente. No se me ocurre otra cosa. Como puedo utilizar el comodin para que también contemple saltos de pagina?
  #13 (permalink)  
Antiguo 05/04/2010, 12:31
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: subcadena comprendida entre tags html

agrega el modificador s

'/<font size="4">Previous.*(<\/font>)/is'

la s indica que el punto incluya los saltos de linea
__________________
More about me...
~ @rhyudek1
~ Github
  #14 (permalink)  
Antiguo 05/04/2010, 12:44
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Gracias, pero no parece funcionar. Me daja sin contenido:
Código PHP:
$patterns = array();
            
$patterns[0] = '/(<font size="4">).*Previous:.*<\/font>/is';
            
$patterns[1] = '/<font size="4">.*Previous.*(<\/font>)/is';
            
$replacements = array();
            
$replacements[0] = '<span style="float: left">';
            
$replacements[1] = '</span>';
            
$texto preg_replace($patterns$replacements$texto); 
Estoy buscando documentacion en la web. Intente esto, pero sin suerte:
'/<font size="4">.*Previous.*[\x00-\x7F]*.*(<\/font>)/i';
  #15 (permalink)  
Antiguo 05/04/2010, 12:48
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: subcadena comprendida entre tags html

ahora si que me perdi :P
en verdad tu expresion regular esta bastante extraña
__________________
More about me...
~ @rhyudek1
~ Github
  #16 (permalink)  
Antiguo 05/04/2010, 12:55
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Esto es lo que hay en el manual: Reemplazo múltiple, usando arrays.

Cita:
<?php
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);
?>
http://php.net/manual/en/function.preg-replace.php

Y puedo reemplazar la primera etiqueta, salvo por el conflicto con los saltos de linea. En cuanto a la segunda etiqueta, nunca pude reemplazarla.
  #17 (permalink)  
Antiguo 05/04/2010, 13:04
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: subcadena comprendida entre tags html

se bien como usar el preg_replace.. lo que no entiendo es

preg_replace('/(<font size="4">).*Previous:.*<\/font>/is', '<span style="float: left">', $texto);

eso te reemplazara todo el texto :S! no solo lo que tienes con ()
__________________
More about me...
~ @rhyudek1
~ Github
  #18 (permalink)  
Antiguo 05/04/2010, 13:09
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

AY! Y yo que pensaba que estaba entendiendo las expresiones regulares!!!

No es que solo vale lo que está entre parentesis?

O es que lo que vale es lo que va entre barras? / /

Por favor aclarame.
  #19 (permalink)  
Antiguo 05/04/2010, 13:13
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: subcadena comprendida entre tags html

lo que va entre las barras y los parentesis
te dejo un ejemplo mejor

Código PHP:
Ver original
  1. $texto = "<div style='border:1px solid #000;'>texto en el div</div>";
  2. echo preg_replace('/<div([^>]*)>(.*)<\/div>/', '<span$1>$2</span>', $texto);

ahi si te fijas reemplazo todos los div por span, manteniendo sus atributos

$1 <-- eso captura lo que haya en el primer paréntesis
$2 <-- lo mismo pero el segundo y asi sucesivamente
__________________
More about me...
~ @rhyudek1
~ Github
  #20 (permalink)  
Antiguo 05/04/2010, 17:42
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Mil gracias! Ahora estoy corrigiendo todo mi codigo, que se estaba poniendo muy sucio.

Esto funciona:
Cita:
$patron = '/<font size="4">(.*?)<\/font>/is';
$texto = preg_replace($patron, '<span style="float: left">$1</span>', $texto);

Pero para que funcione es muy importante teminar el contenido del parentesis con un ? (interrogante). De otra manera, el tag de cierre no es reemplazado. No se por qué.

Última edición por mayid; 05/04/2010 a las 18:21
  #21 (permalink)  
Antiguo 06/04/2010, 07:17
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: subcadena comprendida entre tags html

mmm el signo ? al lado de un * no sirve de nada ya que el cuantificador * de por si solo ya condiciona la existencia o no de los caracteres!
__________________
More about me...
~ @rhyudek1
~ Github
  #22 (permalink)  
Antiguo 06/04/2010, 20:28
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: subcadena comprendida entre tags html

Parece que si, que tiene algo que ver. Con la codicia:
http://www.ignside.net/man/php/regex.6.php

Para optimizar mi busqueda al parece necesito el modificador /U . Si no, (.*) se pone codicioso y hace desastres. Selecciona links que van de punta a punta!

Nueva nota:

Cita:
mmm el signo ? al lado de un * no sirve de nada ya que el cuantificador * de por si solo ya condiciona la existencia o no de los caracteres!
http://www.forosdelweb.com/f18/expre...7/#post2943067

Ahi está perfectamente explicado el tema del uso de .*? para evitar el greedy matching.

Última edición por mayid; 07/04/2010 a las 11:54

Etiquetas: html, subcadena, tags
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 01:50.