Foros del Web » Programando para Internet » PHP »

problema con expresiones regulares

Estas en el tema de problema con expresiones regulares en el foro de PHP en Foros del Web. Hola amigos, tengo un pequeño problema con expresiones regulares, ya tengo escrita estas 2 expresiones y me trabajan bien: Código PHP: $regExp2 = "/href=\"(.*?)\"/is"  ; ...
  #1 (permalink)  
Antiguo 06/02/2009, 08:49
 
Fecha de Ingreso: enero-2009
Ubicación: en la casa
Mensajes: 223
Antigüedad: 11 años
Puntos: 3
problema con expresiones regulares

Hola amigos, tengo un pequeño problema con expresiones regulares, ya tengo escrita estas 2 expresiones y me trabajan bien:

Código PHP:
$regExp2="/href=\"(.*?)\"/is" ;
$regExp2="/<a.*?>(.*?)<\/a>/is"
la primera es para sacar todas las href de un html y la segunda es para sacar las links que se encuentran entre <a></a>;
lo que en este momento quiero hacer es:
1) sacar las html que se encuentren en un texto sin importar si son links o solo texto
2) sacar las html solo de texto, que no se encuentren antes de href u entre <a></a>

me puse a leer un poco y lo que consegui fue lo siguiente para en primer caso
Código PHP:
$regExp3="/^http/is" ;
o otro
$regExp3
="/http$/is" 
no se cual de las dos esta bien para mi caso, pero ninguna me funciona, si pueden ayudarme, gracias

Última edición por diego007007; 06/02/2009 a las 09:11
  #2 (permalink)  
Antiguo 06/02/2009, 08:57
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 11 años, 6 meses
Puntos: 416
Respuesta: problema con expresiones regulares

Es mejor usar una funcion de cadenas, como stripos()

Si stripos($cadena, 'http://'); devuelve 0, quieres decir que la cadena comienza con http:// y por lo tanto es una direccion. Luego de ahi puedes usar file_get_contents() para leer el archivo y obtener las URL dentro de este.
Si stripos devuelve FALSE o un valor diferente de 0, pues solamente tienes que leer la cadena.
  #3 (permalink)  
Antiguo 06/02/2009, 09:08
 
Fecha de Ingreso: enero-2009
Ubicación: en la casa
Mensajes: 223
Antigüedad: 11 años
Puntos: 3
Respuesta: problema con expresiones regulares

hola Ronruby, estoy leyendo sobre esta funcion stripos() y creo que si da el resultado como yo lo necesito, pero el problema es que tengo ya un programa bien grande que necesita usar esas expresiones regulares, no hay forma de hacerlo con expresiones regulares?, por lo menos la primera parte si creo se puede hacer
  #4 (permalink)  
Antiguo 06/02/2009, 09:13
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 11 años, 6 meses
Puntos: 416
Respuesta: problema con expresiones regulares

Es que no vale la pena, si puedes hacerlo con funciones de cadena, es mejor asi. Estas consumen mucho menos que las expresiones regulares.

Pero si deseas usar expresiones regulares, entonces el patron /^http:\/\//i deberia funcionar.
  #5 (permalink)  
Antiguo 06/02/2009, 09:28
 
Fecha de Ingreso: enero-2009
Ubicación: en la casa
Mensajes: 223
Antigüedad: 11 años
Puntos: 3
Respuesta: problema con expresiones regulares

Hola, tengo este codigo, pero no me trabaja con esa expresion regular:

Código PHP:
$swear = array("MySQL");
$textfile_get_contents("codigo.txt");
foreach(
$swear as $key=> $value){
$text str_replace("$value"" "$text);
}
$regExp1="/^http:\/\//i";
$file = ('$text');
preg_match_all($regExp1,$text,$a);
$count count($a[1]);
echo 
"<b>Number of Urls</b> = " .$count."<p>";
for (
$row 0$row $count $row++) {
echo 
$a[1]["$row"]."<br>";
$link $a[1]["$row"]." <br> ";
$url $link;
$fh fopen("direcciones.txt""a" );
fwrite$fh$url);
fclose$fh );

Alguien tiene alguna idea del porque no trabaja con la $regExp1, pero si uso la $regExp2 o la $regExp3 si trabaja.

Última edición por diego007007; 01/04/2009 a las 07:46
  #6 (permalink)  
Antiguo 06/02/2009, 09:34
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 11 años, 6 meses
Puntos: 416
Respuesta: problema con expresiones regulares

Espera un momento, tu lo que quieres es:
Sacar las URL de un archivo o evaluar si la fuente de donde extraeras las URL es una cadena o una direccion?
  #7 (permalink)  
Antiguo 06/02/2009, 09:36
 
Fecha de Ingreso: enero-2009
Ubicación: en la casa
Mensajes: 223
Antigüedad: 11 años
Puntos: 3
ya lo consegui amigos, usando
Código PHP:
$regExp1="/(http:[^ ]*)/i"
Pero tengo un nuevo problema con expresiones regulares, tengo el siguiente codigo
Código PHP:
<?
function Obtener_contenidos1($url1,$inicio1='',$final1){
$source1 = @file_get_contents($url1)or die('se ha producido un error');
$posicion_inicio1 strpos($source1$inicio1) + strlen($inicio1);
$posicion_final1 strpos($source1$final1) - $posicion_inicio1;
$found_text1 substr($source1$posicion_inicio1$posicion_final1);
return 
$inicio1 $found_text1 .$final1;
}    
$url1 "http://www.threatexpert.com/report.aspx?md5=2a306cc6ac1767d5548529285ec0cd45";
$megaObtener_contenidos1($url1,'<table cellpadding="0" cellspacing="0" style="width:100%"><tr><td><img style="border: none"             src="./resources/other_mod.gif"/></td><td width="100%" class="h3">Other details</td></tr></table>','<div class="discl">');
$d $mega;
$swear1 = array("<li>""</li>""<td class=\"cell_1\">""</td>""<td>""</tr>""<tr>");
foreach(
$swear1 as $key=> $value){
$d str_replace("$value"" "$d);
}    
$marca "/\.([a-z]{2,4})$/";
preg_match_all($marca,$d,$c);
echo 
$c."<br>";
$count1 count($c[1]);
echo 
$count1."<br>";
for (
$r 0$r $count1 $r++) {
    echo 
$c[1][$r]."<br>";
}
?>
Lo que necesito es que saque las direcciones por el dominio de primer nivel, en este caso creo que tendria que mostrarme los .exe, pero no muestra nada; sera problema de la expresion regular o del codigo en si ya que siuso como ejemplo la siguiente expresion regular "/(http:[^ ]*)/i" si funcona, de antemano gracias

El codigo lo simplifique de esta manera:
Código PHP:
$str file_get_contents("http://www.threatexpert.com/report.aspx?md5=2a306cc6ac1767d5548529285ec0cd45");
$text1 ereg_replace("</td>"" "$str);
$text2 ereg_replace("<br>"" "$text1);
$text3 ereg_replace("\""" "$text2);
$text ereg_replace("</li>"" "$text3);
$swear = array("http://www.threatexpert.com""<td>""</tr>""<tr>");
foreach(
$swear as $key=> $value){
$text str_replace("$value"" "$text);
}
$regExp1="/(\.[a-z]{1,4}[$ ]*)/i";
$file = ('$text');
preg_match_all($regExp1,$text,$a);
$count count($a[1]);
echo 
$count;
for (
$row 0$row $count $row++) {
echo 
$a[1]["$row"]."<br>";

pro no se como hacer para que muestre el array

el codigo lo corregi y ya muestra los dominios de primer nivel, pero falta que muestre toda la direccion como en el caso de los exe, tendria que mostrar im/172.exe im/podmena.exe im/adv.exe etc el dominio de primer nivel con el de segundo, pero no muestra nada de eso,
buscando en lagunos lugares e podido hacer esta expresion regular que muestra algo de lo que necesito, pero necesito mejorarlo
Cita:
$regExp1="/([^ ]*)(\.[a-z]{1,4}[$ ]*)/i";
alguien me ayude, please!!!

LLegue a esto pero me sale error
Código PHP:
$str file_get_contents("http://www.threatexpert.com/report.aspx?md5=2a306cc6ac1767d5548529285ec0cd45");
$text1 ereg_replace("</td>"" "$str);
$text2 ereg_replace("<br>"" "$text1);
$text3 ereg_replace("\""" "$text2);
$text ereg_replace("</li>"" "$text3);
$swear = array("http://www.threatexpert.com""<td>""</tr>""<tr>""<li>""<br>");
foreach(
$swear as $key=> $value){
$text str_replace("$value"" "$text);
}
$regExp1="/[^.]+\.[^.]+$/i";
preg_match($regExp1$text$coincidencias);
$count count($coincidencias[1]);//error aqui
for ($row 0$row $count $row++) {
    echo 
$coincidencias[1][$row]."<br>";

el error es:
Código PHP:
NoticeUndefined offset1 in C:wampwwwkavget.php on line xx 
Please, help!!!

Última edición por GatorV; 02/04/2009 a las 20:15
  #8 (permalink)  
Antiguo 02/04/2009, 15:55
 
Fecha de Ingreso: septiembre-2008
Mensajes: 350
Antigüedad: 11 años, 4 meses
Puntos: 31
Respuesta: problema con expresiones regulares

el Error Con esto lo puedes Solucionar.

if(isset($coincidencias[1])){

Código PHP:
<?php
$str 
file_get_contents("http://www.threatexpert.com/report.aspx?md5=2a306cc6ac1767d5548529285ec0cd45");
$text1 ereg_replace("</td>"" "$str);
$text2 ereg_replace("<br>"" "$text1);
$text3 ereg_replace("\""" "$text2);
$text ereg_replace("</li>"" "$text3);
$swear = array("http://www.threatexpert.com""<td>""</tr>""<tr>""<li>""<br>");
foreach(
$swear as $key=> $value){
$text str_replace("$value"" "$text);
}
$regExp1="/[^.]+\.[^.]+$/i";
preg_match($regExp1$text$coincidencias);
//---------------------------
if(isset($coincidencias[1])){
//---------------------------
$count count($coincidencias[1]);//error aqui
for ($row 0$row $count $row++) {
    echo 
$coincidencias[1][$row]."<br>";
  }
//--------------------------- 
}//else{ Otra cosa }
//---------------------------
__________________
╬-----╬
║☺₧☻║
╬-----╬
  #9 (permalink)  
Antiguo 02/04/2009, 16:01
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 12 años, 2 meses
Puntos: 18
Respuesta: problema con expresiones regulares

la librería POSIX a partir de php 5.3 es obsoleta.

reemplaza ereg_replace por preg_replace.
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #10 (permalink)  
Antiguo 02/04/2009, 16:07
 
Fecha de Ingreso: enero-2009
Ubicación: en la casa
Mensajes: 223
Antigüedad: 11 años
Puntos: 3
Respuesta: problema con expresiones regulares

Gracias thezzin, se arreglo el problema, pero sigue sin sacar las direcciones por dominio de primer nivel, aguien que tenga alguna idea de como hacerlo
Gracias argy ya puse en lugar de ereg_replace puse preg_replace.
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 19:04.