Foros del Web » Programando para Internet » PHP »

buscar links sin http ni www ni # al principio

Estas en el tema de buscar links sin http ni www ni # al principio en el foro de PHP en Foros del Web. Estoy queriendo escribir una expresion regular para filtrar links a paginas exteriores. Los resultados deberían ser todos los links internos, que no empiezen con #, ...
  #1 (permalink)  
Antiguo 11/05/2010, 20:27
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 10 años, 7 meses
Puntos: 101
buscar links sin http ni www ni # al principio

Estoy queriendo escribir una expresion regular para filtrar links a paginas exteriores. Los resultados deberían ser todos los links internos, que no empiezen con #, ni contengan http, www o .com

La primera dificultad es negar el primer caracter. Si pongo esto, me elije un caracter que no sea >, pero que puede ser por ejemplo "h".

[^#]

Tengo escrito un look forward para evitar links que contengan http:

href="((?:(?!http).)*)"

Pero no encuentro manera de negar dos posibilidades a la vez. Hay algo escrito en estas paginas, pero no pude aplicarlo:
http://www.ibm.com/developerworks/op...os-php-regex2/ (Listing 4. Look-ahead example)
http://www.perlmonks.org/?node_id=518444 (Nesting)

Tendría que ser esto:

/<a href="((?: (?!http) | (?!www) .)*)">(.*)<\/a>/is

o esto:

/<a href="(?= (?: (?!http)) | (?:(?!www) .)*)">(.*)<\/a>/is

Probe a mi manera, así, pero tampoco va: ((?:(?![http|www]).)*)

Alguna ayuda please?
  #2 (permalink)  
Antiguo 12/05/2010, 11:22
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 10 años, 7 meses
Puntos: 101
Respuesta: buscar links sin http ni www ni # al principio

Sigo sin resolverlo. Creo que las expresiones regulares para esto son difíciles, así que opté por combinarlas con otros métodos. Pero me trabé.

Lo que necesito es buscar links en una pagina. Los links puede que tengan un subfijo _de o _es o lo que fuere. O también puede que no lo tengan. Yo lo que necesito, en todo caso, es reemplazar ese subfijo por otro:

Código PHP:

$subfix 
$_POST['subfix'];
$pageID $_POST['pageID'];

$sections mysql_query("SELECT sections FROM manual_contents WHERE page_id = '$pageID'") or die("Error selecting page".mysql_error());
            
while (
$section mysql_fetch_array($sections)){

// anchors subfix
$hrefName '/<a href="([^"]*)">(.*?)<\/a>/is'// http|www|com

            
preg_match_all($hrefName$section[0], $matchesPREG_SET_ORDER);
                        
            for(
$i=0;$i<count($matches);$i++){ 
                                    
                if (isset(
$matches[$i][1]) and trim($matches[$i][1]) != "") {  
                    
                    
$link $matches[$i][1];
                    if(
trim(substr($link01)) != "#")  {}
                    elseif (
strpos($link,"http") !== false) {}
                    elseif (
strpos($link,"www") !== false) {}
                    elseif (
strpos($link,".com") !== false) {}
                    else {
                        
str_replace($subfix.".html""_".$_SESSION['lang'].".html"$link);
                    }
                }        
                }; 
En este codigo, primero obtengo los links. Luego compruebo:

- que el primer caracter no sea #
- que la palabra no contenga "http"
- que la palabra no contenga "www"
- que la palabra no contenga ".com"

Luego reemplazo los links que pasaron el filtro. Pero los resultados se pierden, porque no estoy modificando el texto original.... :(
  #3 (permalink)  
Antiguo 12/05/2010, 12:45
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 10 años, 7 meses
Puntos: 101
Respuesta: buscar links sin http ni www ni # al principio

Finalmente lo solucioné, en gran parte, así:

Código PHP:
// anchors subfix
$hrefName '/<a href=([^>]*)>(.*?)<\/a>/is'// http|www|com

            
preg_match_all($hrefName$contents$matchesPREG_SET_ORDER);
                        
            for(
$i=0;$i<count($matches);$i++){ 
                                    
                if (isset(
$matches[$i][1]) and trim($matches[$i][1]) != "") {  
                    
                    
$link str_replace('"','',trim($matches[$i][1]));
                    
$link str_replace("'",'',trim($link));
                        
                    if(
trim(substr($link01)) == "#")  {}
                    elseif (
strpos($link,"http") !== false) {}
                    elseif (
strpos($link,"www") !== false) {}
                    elseif (
strpos($link,".com") !== false) {}
                    else {
                        
                        
$replacement str_replace($Originalsubfix.".html"$destSuffix.".html"$link);
                        
$contents str_replace($link$replacement$contents);    
                        

                    }
                }        
                }; 
Aunque hay un problema. Con la selección obtengo no solo los href sino cualquier otro atributo que tenga la etiqueta <a>

Si usara este otro selector, dejando las comillas afuera, también habría un problema:

$hrefName = '/<a href="([^>]*)">(.*?)<\/a>/is';

- por un lado, las comillas simples no se detectarían.
- por otro lado, en las paginas que estoy procesando (muchas) hay links que tienen salto de renglon desdpues del signo =

De cualquier manera, la expresión tendría que funcionar porque hay un modificador /s, pero no funciona.
  #4 (permalink)  
Antiguo 12/05/2010, 13:25
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 10 años, 7 meses
Puntos: 101
Respuesta: buscar links sin http ni www ni # al principio

Ok. Lo tengo solucionado:

'/<a href=[\n|\r]*[\"|\']([^>]*)[\"|\']>(.*?)<\/a>/is'

Y luego todo el resto (la iteración).

  #5 (permalink)  
Antiguo 12/05/2010, 13:30
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 10 años, 1 mes
Puntos: 334
Respuesta: buscar links sin http ni www ni # al principio

xDDDDDD
a esto es lo que se llama .. autoservicio

jajaja
suerte!
__________________
More about me...
~ @rhyudek1
~ Github

Etiquetas: links, principio, www, https
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:03.