2011-07-01 54 views
5

我需要一個正則表達式來匹配任何包含至多2破折號和2個點的字符串。 沒有必要是一個破折號也不是一個點,但如果有3 +破折號 3個點或甚至兩個3+破折號和3+點,則正則表達式不能匹配字符串。正則表達式匹配,如果最多出現兩次點和破折號

打算在PHP中使用。
我知道使用PHP函數的簡單替代方法,但它只能用於允許使用正則表達式進行篩選的大型系統中。

實施例的字符串,將被匹配:
hello-world.com

實施例的字符串,將不匹配:
www.hello-world.easy.com 你好世界 - 異丙win.com

+0

你能解釋一下嗎?你想驗證網址嗎? – balki

+0

我不明白具有兩個以上的點的URL是無效的:-)但是,它用於過濾OUT url,它們太複雜並且似乎自動生成。 – Zoon

回答

6

這是否符合您的期望?

(?!^.*?([.-]).*\1.*\1.*$)^.*$ 

看到它here on Regexr

(?!^.*?([.-]).*\1.*\1.*$)是一種消極的前瞻。它匹配第一個.-將其放入捕獲組1中,然後檢查是否還有兩個使用hte反向引用\1。只要發現三個,表達就不會再匹配了。

^.*$匹配從開始到結束的所有內容,如果負向預測未匹配。

+0

謝謝你的解釋。它的作品也很完美。 – Zoon

0

使用此:(?!^.*?([-.])(?:.*\1){2}.*$)^.*$

1

此測試正則表達式會做的伎倆:爲什麼你需要這樣的要求

$re = '/# Match string with 2 or fewer dots or dashes 
    ^       # Anchor to start of string. 
    (?=[^.]*(?:\.[^.]*){0,2}$) # Assert 2 or fewer dots. 
    (?=[^\-]*(?:-[^\-]*){0,2}$) # Assert 2 or fewer dashes. 
    .*       # Ok to match string. 
    $       # Anchor to end of string. 
    /sx'; 
相關問題