Php 正则表达式模式匹配

Php 正则表达式模式匹配,php,regex,preg-match,Php,Regex,Preg Match,说到正则表达式,我完全是个新手,我需要一种方法来匹配以下模式: 0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25 解释: 共有6个部分,用下划线分隔。第一部分始终为6[a-zA-Z0-9]个字符。第二节和第三节是MD5散列,因此它们始终是32个[a-zA-Z0-9]字符。最后3节只能是数字 我正在使用PHP preg_match来实现这一点 提前感谢。编辑-为了更完整,您可以执行

说到正则表达式,我完全是个新手,我需要一种方法来匹配以下模式:

0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25
解释:

共有6个部分,用下划线分隔。第一部分始终为6[a-zA-Z0-9]个字符。第二节和第三节是MD5散列,因此它们始终是32个[a-zA-Z0-9]字符。最后3节只能是数字

我正在使用PHP preg_match来实现这一点


提前感谢。

编辑-为了更完整,您可以执行以下操作:

if (preg_match('/[a-z0-9]{6}_[a-f0-9]{32}_[a-f0-9]{32}_\d+_\d+_\d+/i', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}
为了使其更简洁,我还将[0-9]与\d类重新放在一起,将MD5的匹配更改为[a-f0-9],并将[a-zA-Z0-9]更改为[a-Z0-9],并将
/I
包含在不区分大小写的代码中

如果您真的希望,表达式也可以重写为:

/[a-z0-9]{6}(?:{[a-f0-9]{32}}{2}(?:{\d+{3}/i
$string = "0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25";
if (preg_match('/^([a-z0-9]{6})_([a-f0-9]{32})_([a-f0-9]{32})_([0-9]+)_([0-9]+)_([0-9]+)$/i', $string, $matches))
{
    echo "Match!<br />\n";
    echo "First: ".$matches[1]."<br />\n";
    echo "MD5 hashes: ".$matches[2]. " - ".$matches[3]."<br />\n";
    echo "numbers: ".$matches[4]. " - ".$matches[5]. " - ".$matches[6]."<br />\n";
}
如果(preg_match('/^([a-z0-9]{6}){U([a-f0-9]{32}){U([a-f0-9]{32}){U([0-9]+){U([0-9]+)$/i',$string,$matches)) { 回显“匹配!
\n”; echo“First:”.$匹配[1]。“
\n”; echo“MD5哈希:”.$matches[2]。“-”$matches[3]。“
\n”; 回显“数字:”.$matches[4]。“-”$matches[5]。“-”$matches[6]。“
\n”; }
注意事项:

  • md5只是[a-f0-9],而不是[a-z0-9]
  • 我将/I设置为不区分大小写的匹配, 而不是在中指定[a-zA-Z] 每一部分
您可以尝试:

<?php
$string = '0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25';
if (preg_match('/([a-zA-Z0-9]{6})_([a-fA-F0-9]{32})_([a-fA-F0-9]{32})_([0-9]+)_([0-9]+)_([0-9]+)/',$string,$match)) {
    print_r( $match );
}
?>

[a-zA-Z0-9]{6}}{[a-f0-9]{32}}{[a-f0-9]{32}{[0-9]+[0-9]+{[0-9]+

参考:


另外,由于php使用PCRE(Pearl Compatible Regular Expressions,珍珠兼容正则表达式),您可以使用这个漂亮的备忘单:

根据您的(有些不完整的)规范,这里是我能做的最短备忘:

preg_match('/[a-z\d]{6}(?:_[a-f\d]{32}){2}(?:_\d+){3}/i', $string);

这将恰好匹配一个字母或数字的六个实例;后跟下划线和32个十六进制数字,两次;后跟下划线和任意位数,3次。最后的
/i
将其置于不区分大小写的模式。

尝试阅读此页面:从开始到结束,我已经编辑了几次,如果仍然不起作用,请用[0-9]替换\d(我现在正在编辑)。我已经指出,您尝试匹配的整个文本就是您所说的模式。如果您需要在较大的文本中匹配该模式,请删除模式开头的
^
和结尾的
$
。效果很好,除非我在最后三部分的数字之间添加字母,否则如果我不将值返回到$match中,结果仍然为正值。无论哪种情况,这都足以满足我的需要。谢谢@这很奇怪。我无法解释。不客气!