2010-01-16 19 views
160

dışlamak için. Bununla birlikte, /ignoreme ve /ignoreme2 gibi bir dizi dize değerini hariç tutmasını isterim.Bir düzenli ifade aşağıdaki gibi ben normal bir ifade var bir kelime/dize

Birkaç varyant denedim ama işe yaramayacak gibi görünmüyor! Şimdi

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$ 

:

Benim son zayıf girişimi

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$ 

Herhangi bir yardım minnetle

+0

Olası kopya: http://stackoverflow.com/questions/1395177/regex-to-exclude-a-specific-string-constant –

cevap

215

henüz başka bir yolu: (a negative look-ahead kullanarak):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

Not: sadece tek bir yakalama ifade var: ([a-z0-9]+).

+1

Brilliant göz ardı edilir, bu hile yapmış gibi görünüyor. URL'yi yeniden yazmak için bu kurala gerçekten ihtiyacım var ve "görüntüler", "css" ve "js" klasörlerini görmezden gelmek istedim. Yani benim kuralı şu şekildedir: ^/(?! css | js | images) ([az] +) /? (\? (. +))? $ ve/Profile.aspx?id= için yeniden yazar. $ 1 & $ 3 Bu kural doğru şekilde çalışacak ve sorgu dizgisini de yaytacak mı? Dolayısıyla, bir kullanıcı http://alanayim.com/hello?abc=123 adresini ziyaret ederse, http://mydomain.com/Profile.aspx?id=hello&abc=123 için tekrar yazmak istiyorum. orijinal istekte querystring yakalamak için sonunda (. +) performans hakkında biraz emin değilim. – romiem

+0

Böyle görünüyor başka bir soru. Gördüğünüz regexp, sorgu dizesini yakalar - test eder ve sorgu dizgesinin gelip gelmediğine bakın. Ayrıca - '(\? (. +))?$ 'hızlı olmalı. Hız konusunda çok fazla endişelenmem. – Seth

+0

Bu benim için çalışmadı, Alix Axel'in çözümü işe yaramadı. Java'nın java.util.regex.Pattern sınıfı kullanıyorum. –

10

sen iki kelimeyi hariç tutmak istediğiniz gibi

:-) mutluluk duyacağız edildi

, bir kavşak noktasını gerek her iki koşul da doğru olmalıdır (ne ihmal ne de ihmali2 izin verilir) atch.

+0

Bu, daha kısa olanı ile eşdeğerdir ve bu bir dizi alternatifin olumsuz bir görünümüdür. . – ChrisF

+1

@ChrisF Hayır, gerçekten değil. Seth’in çözümü '/ ignoremenot' gibi bir şeyle eşleşmez, çünkü' '' '' ignoreme'' izler. – Gumbo

26

Bu yapmalıyım:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3) 

yapabilirsiniz istediğiniz gibi, burada basit bir PHP uygulamasıdır kadar gözardı kelimeleri ekleyin:

İşte
$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...'); 

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string); 
+0

Geriye bakmanın sabit genişlikte bir desen gerektirdiğini düşündüm? – simon

+0

@simon: Öyle mi? –

+2

@AlixAxel Bunu yapar, ancak akıllı regex lib'leri, her bir alternatif sabit uzunlukta olduğu sürece, alternatifler için (ve en uzun olanını) değişken uzunluklarda bir değişime izin verecektir. – ChrisF