Соответствие шаблону регулярных выражений - PullRequest
2 голосов
/ 23 мая 2011

Я полный новичок, когда дело доходит до регулярных выражений, и мне нужен способ соответствовать следующему шаблону:

0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25

Объяснено:

Есть 6 разделов, разделенных подчеркиванием.Первый раздел всегда состоит из 6 [a-zA-Z0-9] символов.Второй и третий разделы являются хешами MD5, поэтому они всегда будут содержать 32 символа [a-zA-Z0-9] каждый.Последние 3 раздела могут быть только числами.

Для этого я использую PHP preg_match.

Заранее спасибо.

Ответы [ 5 ]

8 голосов
/ 23 мая 2011

Вот самое короткое, что я могу сделать, исходя из ваших (несколько неполных) характеристик:

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

Это будет соответствовать ровно шести экземплярам буквы или цифры;с последующим подчеркиванием и 32 шестнадцатеричными цифрами, дважды;с последующим подчеркиванием и любым количеством цифр 3 раза./i в конце переводит его в режим без учета регистра.

4 голосов
/ 23 мая 2011

Вы можете попробовать:

<?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 );
}
?>
3 голосов
/ 23 мая 2011
$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";
}

Примечания:

  • md5 - это просто [a-f0-9], а не [a-z0-9].
  • Я ставлю / i на совпадения без учета регистра, вместо указания [a-zA-Z] в каждая часть.
1 голос
/ 23 мая 2011

Редактировать - чтобы быть более полным, вы можете сделать это:

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

0 голосов
/ 23 мая 2011

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

ref: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

также, так как php использует PCRE (регулярные выражения, совместимые с Pearl), вы можете использовать эту простенькую шпаргалку: http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/

...