2011-07-29 48 views
1

例如重複的數據,我有下一個字符串:的preg_match的字符串與它

2556974513||1025635214|1236521025|0124576832 

在字符串中必須是10位數然後|和這個公式可以重複n次,如何匹配嗎?

也許有這樣做,比這一個最簡單的方法:

preg_match('/^[\d]{10}|[\d]{10}| ... [\d]{10}$/', $string); 

感謝。

回答

3

你會想是這樣的:

^(?:\d{10}\|)+\d{10}$ 

\d{10}末是有,因爲有結尾沒有|字符。 +將匹配一個或多個前面的模式。如果只有一組10位數字是有效的,則將+替換爲*,這將匹配零次或多次。

請注意,|字符需要轉義,因爲它在正則表達式中用作OR運算符。

+0

感謝,但重複的數量是動態的,在這種情況下,我有以爆炸字符串,然後每次計算重複次數。 preg_match是否有自己計算重複次數的方法? – John

+0

@John:^(?:\ d {10} \ |)* \ d {10} $ - 你可能想要讀懂正則表達式,你問的問題很簡單。 – GaretJax

+0

@John - 啊我誤解了這個問題,編輯了我的答案,以便它可以匹配任意數量的重複。如果有一組10位數字(即'2556974513'應該匹配)是有效的,則用'*'替換正則表達式中的'+',匹配0或更多次。 –

1

這意味着「一個或一個以上的(10位然後通過管道)」:

(\d{10}\|)+ 

編輯:這不是從你的問題清楚,如果尾礦管道將在那裏與否。如果沒有,那麼:

(\d{10}\|)*(\d{10}) 

另外,如果你總有需要提取值,你可能也只是做:

foreach (explode('|', $string) as $value) { 
    if (preg_match('/^\d{10}$/', $value)) { 
     ... 
    } 
} 
+0

謝謝,非常有用 – John