2011-03-25 30 views
12

Estoy tratando de coincidir con una cadena que no contiene una subcadenaexpresión regular no contiene la subcadena

Mi cadena comienza siempre "http://www.domain.com/"

La subcadena que quiero excluir de partidos es ".a /", que viene después de la cadena (un nombre de carpeta en el nombre de dominio)

habrá caracteres de la cadena después de la subcadena que quiero excluir

Por ejemplo:

"http://www.domain.com/.a/test.jpg" no debe ser igualado

Pero "http://www.domain.com/test.jpg" debe ser

Respuesta

25

Use una afirmación de búsqueda negativa hacia delante como:

^http://www\.domain\.com/(?!\.a/).*$ 

Rubular Link

La parte (?!\.a/) concuerda con algo que no sea .a/

+0

¿Qué pasa si quiero terminar la coincidencia con una comilla (")? Como estoy buscando a través de HTML. –

0

Lo intentaría con

^http:\/\/www\.domain\.com\/([^.]|\.[^a]).*$ 

Quiere hacer coincidir su dominio, más todo lo que no continúe con a. y todo lo que continúe con a. pero no es a. (Eventualmente puede agregarlo/si es necesario después)

+1

Esto está bien - hasta * otro * programador se le pide que lo extienda para excluir también .b, .c y .whatElsethemanagement doesesnotwant – Ingo

+0

Sí ... Obtuve ese @Ingo. Por cierto, olvidé el \ before/ –

5

Mi consejo en tales casos es no construir expresiones geográficas demasiado complicadas con aserciones de búsqueda anticipada negativas o cosas por el estilo.
¡Manténgalo simple y estúpido!
Haz 2 coincidencias, una para los aspectos positivos, y clasifica más adelante los negativos (o al revés). La mayoría de las veces, las expresiones regulares se vuelven más fáciles, si no triviales. Y su programa se vuelve más claro.
Por ejemplo, para extraer todas las líneas con foo, pero no FooBar, utilizo:

grep foo | grep -v foobar 
0

Si no usa el futuro, pero simplemente expresiones regulares, puede simplemente decir, si coincide con su dominio, pero no coincide con una nota .a/

<?php 

function foo($s) { 

    $regexDomain = '{^http://www.domain.com/}'; 
    $regexDomainBadPath = '{^http://www.domain.com/\.a/}'; 

    return preg_match($regexDomain, $s) && !preg_match($regexDomainBadPath, $s); 
} 

var_dump(foo('http://www.domain.com/')); 
var_dump(foo('http://www.otherdomain.com/')); 

var_dump(foo('http://www.domain.com/hello')); 
var_dump(foo('http://www.domain.com/hello.html')); 
var_dump(foo('http://www.domain.com/.a')); 
var_dump(foo('http://www.domain.com/.a/hello')); 
var_dump(foo('http://www.domain.com/.b/hello')); 
var_dump(foo('http://www.domain.com/da/hello')); 

?> 

que http://www.domain.com/.a pasará la prueba, ya que no termina con /.

Cuestiones relacionadas