Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] como hacer esto con preg_match

Estas en el tema de como hacer esto con preg_match en el foro de PHP en Foros del Web. hola foreros, quería hacer una consulta de como hacer un código, eh buscado por todos lados pero no logro entenderlo, quiero extraer automáticamente una parte ...
  #1 (permalink)  
Antiguo 03/05/2013, 14:54
Avatar de danistrein  
Fecha de Ingreso: septiembre-2008
Ubicación: Salta Capital
Mensajes: 550
Antigüedad: 15 años, 7 meses
Puntos: 9
Pregunta como hacer esto con preg_match

hola foreros, quería hacer una consulta de como hacer un código, eh buscado por todos lados pero no logro entenderlo, quiero extraer automáticamente una parte de una cadena ej:

Código PHP:
Ver original
  1. $fuente =
  2. <a href="link"><span>ESTA ES LA <a href="link">PRIMERA</a> CADENA</span></a>
  3. <a href="link"><span>ESTA ES LA <a href="link">SEGUNDA</a> CADENA</span></a>
  4. <a href="link"><span>ESTA ES LA <a href="link">TERCERA</a> CADENA</span></a>
  5. <a href="link"><span>ESTA ES LA <a href="link">CUARTA</a> CADENA</span></a>';
  6.  
  7. function sacar($TheStr, $sLeft, $sRight){
  8.        $pleft = strpos($TheStr, $sLeft, 0);
  9.        if ($pleft !== false){
  10.                $pright = strpos($TheStr, $sRight, $pleft + strlen($sLeft));
  11.                If ($pright !== false) {
  12.                        return (substr($TheStr, $pleft + strlen($sLeft), ($pright - ($pleft + strlen($sLeft)))));
  13.                }
  14.        }
  15.        return '';
  16. }
  17.  
  18. echo sacar($fuente,"<a href="link"><span>","</span></a>");
  19.  
  20. // resultado "ESTA ES LA <a href="link">PRIMERA</a> CADENA"
esto me funciona perfectamente, pero quiero hacerlo con preg_match para que me saque las cuatro cadenas y no solo la primera, me podrían orientar como hacerlo? eh visto la guía oficial en php.net y algunas explicaciones aquí en el foro pero no logro entender como conseguirlo, les agradecería muchísimo la ayuda, saludos
__________________
Appones.net - www.appones.net
  #2 (permalink)  
Antiguo 03/05/2013, 16:40
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: como hacer esto con preg_match

Debes usar preg_match_all en vez de preg_match. También pueden usar las clases DOM.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #3 (permalink)  
Antiguo 03/05/2013, 18:24
Avatar de danistrein  
Fecha de Ingreso: septiembre-2008
Ubicación: Salta Capital
Mensajes: 550
Antigüedad: 15 años, 7 meses
Puntos: 9
Respuesta: como hacer esto con preg_match

gracias, eh leido e intentado hacerlo, como resultado me a salido:
Código ERROR:
Ver original
  1. Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'a' in C:\AppServ\www\cf\3.php on line 16
  2. NULL
este es el codigo:
Código PHP:
Ver original
  1. $fuente = '
  2. <a href="link"><span>ESTA ES LA <strong>PRIMERA</strong> CADENA</span></a>
  3. <a href="link"><span>ESTA ES LA <strong>SEGUNDA</strong> CADENA</span></a>
  4. <a href="link"><span>ESTA ES LA <strong>TERCERA</strong> CADENA</span></a>
  5. <a href="link"><span>ESTA ES LA <strong>CUARTA</strong> CADENA</span></a>';
  6.  
  7.  
  8. $izq= '<a href="link">';
  9. $der= '</a>';
  10.  
  11. preg_match_all("/".$izq."(.+)".$der."/", $fuente, $salida);
  12.  
  13. echo '<pre>'; echo var_dump($salida); echo '</pre>';

como veras, no logro entender como utilizar las expresiones regulares, me podrias ayudar por favor? te lo agradecería muchisimo
__________________
Appones.net - www.appones.net
  #4 (permalink)  
Antiguo 03/05/2013, 19:34
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: como hacer esto con preg_match

Aquí:

Código PHP:
Ver original
  1. $der= '</a>';

Debe ser;

Código PHP:
Ver original
  1. $der= '<\/a>';

Porque usaste el delimitador / o usa otro delimitador.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 03/05/2013 a las 19:40
  #5 (permalink)  
Antiguo 03/05/2013, 19:38
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: como hacer esto con preg_match

No soy experto en expresiones regulares, pero esto debería funcionar, seguramente hay una forma más "limpia" de realizarlo...

Código PHP:
Ver original
  1. <?php
  2.  
  3. $fuente = '
  4. <a href="link"><span>ESTA ES LA <strong>PRIMERA</strong> CADENA</span></a>
  5. <a href="link"><span>ESTA ES LA <strong>SEGUNDA</strong> CADENA</span></a>
  6. <a href="link"><span>ESTA ES LA <strong>TERCERA</strong> CADENA</span></a>
  7. <a href="link"><span>ESTA ES LA <strong>CUARTA</strong> CADENA</span></a>';
  8.  
  9. preg_match_all('/<a href="link"><span>([a-zA-Z0-9\<\>\/ ]+)\<\/span><\/a>/',$fuente,$coincidencias);
  10.  
  11. echo '<pre>';
  12. var_dump($coincidencias);
  13. echo '</pre>';
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #6 (permalink)  
Antiguo 03/05/2013, 19:42
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: como hacer esto con preg_match

Yo prefiero usar DOM para temas de html

Código PHP:
Ver original
  1. <?php
  2.  
  3. $fuente = '
  4. <a href="link"><span>ESTA ES LA <strong>PRIMERA</strong> CADENA</span></a>
  5. <a href="link"><span>ESTA ES LA <strong>SEGUNDA</strong> CADENA</span></a>
  6. <a href="link"><span>ESTA ES LA <strong>TERCERA</strong> CADENA</span></a>
  7. <a href="link"><span>ESTA ES LA <strong>CUARTA</strong> CADENA</span></a>';
  8.  
  9. $doc = new DOMDocument();
  10. $doc->loadHTML($fuente);
  11. $enlaces = $doc->getElementsByTagName('a');
  12.  
  13. foreach ($enlaces as $enlace) {
  14.     echo $enlace->nodeValue . '<br />';
  15. }

Cita:
ESTA ES LA PRIMERA CADENA
ESTA ES LA SEGUNDA CADENA
ESTA ES LA TERCERA CADENA
ESTA ES LA CUARTA CADENA
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #7 (permalink)  
Antiguo 04/05/2013, 18:14
Avatar de danistrein  
Fecha de Ingreso: septiembre-2008
Ubicación: Salta Capital
Mensajes: 550
Antigüedad: 15 años, 7 meses
Puntos: 9
Pregunta Respuesta: como hacer esto con preg_match

agradezco muchísimo por las respuesta y por brindarme su tiempo ante mi consulta, ahora tengo otra incógnita, en cuyo caso que convierta todo esto en una función, y ya no tenga control manual sobre las etiquetas y contenido, existe alguna función que me ayude agregar automáticamente el/los delimitador/es?

Código PHP:
Ver original
  1. $fuente = '
  2. <a href="link"><span>ESTA ES LA <strong>PRIMERA</strong> CADENA</span></a>
  3. <a href="link"><span>ESTA ES LA <strong>SEGUNDA</strong> CADENA</span></a>
  4. <a href="link"><span>ESTA ES LA <strong>TERCERA</strong> CADENA</span></a>
  5. <a href="link"><span>ESTA ES LA <strong>CUARTA</strong> CADENA</span></a>';
  6. $izq= '<a href="link">';
  7. $der= '</a>';
  8.  
  9.  
  10. function sacar($fuente,$izq,$der){
  11.     preg_match_all("/".$izq."(.+)".$der."/", $fuente, $salida);
  12.     return $salida;
  13. }
  14. $final= sacar($fuente,$izq,$der);
  15.  
  16. echo '<pre>'; echo var_dump($final); echo '</pre>';

he probado con preg_quote de esta forma
Código PHP:
Ver original
  1. function sacar($fuente,$izq,$der){
  2.     $izq = preg_quote($izq,'\');
  3.     $der = preg_quote($der,'\');
  4.     preg_match_all("/".$izq."(.+)".$der."/", $fuente, $salida);
  5.     return $salida;
  6. }
pero como verán, el delimitador hace que pierda su función el siguiente símbolo '
como podría solucionarlo?




pd: muy interesante las clases DOM
__________________
Appones.net - www.appones.net
  #8 (permalink)  
Antiguo 04/05/2013, 18:44
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: como hacer esto con preg_match

Debes usar preg_quote en la fuente, no en los delimitadores. Le pasas la fuente y el delimitador que estés usando.

Sobre esto:

Código PHP:
Ver original
  1. $izq = preg_quote($izq,'\');

Debes escaparlo:

Código PHP:
Ver original
  1. $izq = preg_quote($izq,'\\');

recordando lo que dije anteriormente.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #9 (permalink)  
Antiguo 06/05/2013, 08:57
Avatar de danistrein  
Fecha de Ingreso: septiembre-2008
Ubicación: Salta Capital
Mensajes: 550
Antigüedad: 15 años, 7 meses
Puntos: 9
Respuesta: como hacer esto con preg_match

he intentado de esta manera
Código PHP:
Ver original
  1. function sacar($fuente,$izq,$der){
  2.     $izq = preg_quote($izq,'\\');
  3.     $der = preg_quote($der,'\\');
  4.     preg_match_all($izq."(.+)".$der, $fuente, $salida);
  5.     return $salida;
  6. }
Cita:
Warning: preg_match_all() [function.preg-match-all]: Delimiter must not be alphanumeric or backslash in C:\AppServ\www\Anime\3.php on line 16
NULL
y probando asi
Código PHP:
Ver original
  1. function sacar($fuente,$izq,$der){
  2.     $izq = preg_quote($izq,'\\');
  3.     $der = preg_quote($der,'\\');
  4.     preg_match_all("/".$izq."(.+)".$der."/", $fuente, $salida);
  5.     return $salida;
  6. }
Cita:
Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'a' in C:\AppServ\www\Anime\3.php on line 16
NULL
daaah me rompe la cabeza no poder solucionarlo
__________________
Appones.net - www.appones.net
  #10 (permalink)  
Antiguo 06/05/2013, 09:02
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: como hacer esto con preg_match

Estás usando mal preg_quote(), ya que en el segundo argumento deberías especificar el carácter delimitador que estás usando en la expresión pero no lo haces así.

Usas / como delimitador pero estás escapando \ ¿entiendes la diferencia?

Eso es todo, dicha función te ayuda a escapar ciertos caracteres, pero no estás escapando los delimitadores dentro de las secuencias que estás empleando.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 06/05/2013, 09:02
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: como hacer esto con preg_match

Esos errores no son de PHP, si no de como creas el patrón para pasar a preg_match_all, muestra como tienes los patrones...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #12 (permalink)  
Antiguo 06/05/2013, 09:25
Avatar de danistrein  
Fecha de Ingreso: septiembre-2008
Ubicación: Salta Capital
Mensajes: 550
Antigüedad: 15 años, 7 meses
Puntos: 9
De acuerdo Respuesta: como hacer esto con preg_match

me disculpo por mi ignorancia, ahora que lo entendí logre solucionar el problema, gracias a todos su tiempo y por responder a mis incógnitas

Código PHP:
Ver original
  1. function sacar($fuente,$izq,$der){
  2.     $izq = preg_quote($izq,'/');
  3.     $der = preg_quote($der,'/');
  4.     preg_match_all("/".$izq."(.+)".$der."/", $fuente, $salida);
  5.     return $salida;
  6. }
__________________
Appones.net - www.appones.net

Etiquetas: preg_match, preg_match_all
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 07:49.