用于数字格式的快速PHP正则表达式

时间:2014-01-31 20:27:38

标签: php regex

我花了好几个小时搞清楚如何在PHP中编写正则表达式,我只需要允许以下格式的字符串传递:

(any digit)_(any digit)

看起来像:

219211_2

到目前为止,我尝试了很多组合,我认为这个组合最接近解决方案:

/(\\d+)(_)(\\d+)/

如果有办法将最后一个数字(下划线之后的数字)的范围限制为一定数量的数字(例如最大12位数),那就太好了。

我还在学习正则表达式,所以非常感谢任何帮助,谢谢。

4 个答案:

答案 0 :(得分:2)

您不需要在PHP中双重转义\\d

使用此正则表达式:

"/^(\d+)_(\d{1,12})$/"
  • \d{1,12}将匹配1到12个挖掘者
  • 最好使用行开始/结束锚点以避免匹配意外输入

答案 1 :(得分:2)

以下内容:

\d+_\d{1,12}(?!\d)

将匹配“字符串中的任何位置”。如果您需要“在开始时”,“在结尾处”或“这是整个事情”,那么您将需要使用锚点修改它

^\d+_\d{1,12}(?!d)      - must be at the start
\d+_\d{1,12}$           - must be at the end
^\d+_\d{1,12}$          - must be the entire string

演示:http://regex101.com/r/jG0eZ7

说明:

\d+      - at least one digit
_        - literal underscore
\d{1,12} - between 1 and 12 digits
(?!\d)   - followed by "something that is not a digit" (negative lookahead)

最后一件事情很重要,否则它会匹配前12个并忽略第13个。如果您的号码恰好位于字符串的末尾,而您使用的表格我最初只有[^\d],那么在特定情况下它将无法匹配。

感谢@sln指出这一点。

答案 2 :(得分:1)

试试这个:

$regex= '~^/(\d+)_(\d+)$~';
$input= '219211_2';
if (preg_match($regex, $input, $result)) {
 print_r($result);
}

答案 3 :(得分:0)

试试以下正则表达式:

^(\d+)_(\d{1,12})$