2011-07-29 40 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