#php #regex #preg-match
#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.
Заранее спасибо.
Комментарии:
1. Попробуйте прочитать эту страницу: regular-expressions.info/reference.html от начала до конца
Ответ №1:
Вот самое короткое, что я могу сделать, основываясь на ваших (несколько неполных) спецификациях:
preg_match('/[a-zd]{6}(?:_[a-fd]{32}){2}(?:_d ){3}/i', $string);
Это будет соответствовать ровно шести экземплярам буквы или цифры; за ними дважды следует подчеркивание и 32 шестнадцатеричные цифры; за ними следует подчеркивание и любое количество цифр 3 раза. /i
В конце переводит его в режим без учета регистра.
Ответ №2:
Вы могли бы попробовать:
<?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 );
}
?>
Комментарии:
1. Работает отлично, за исключением того, что если я добавлю буквы между числами в последних трех разделах, результат все равно будет положительным, если я не верну значения в $ match. В любом случае, этого достаточно для того, что мне было нужно. Спасибо!
2. @Vitality Isikov Это странно. Я не могу это объяснить. Добро пожаловать!
Ответ №3:
$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. Я редактировал его несколько раз, если все еще не работает, замените d на [0-9] (я редактирую его сейчас)
2. Я добавил, что весь текст, который вы пытаетесь сопоставить, является шаблоном, который вы сказали. Если вам нужно сопоставить этот шаблон внутри текста большего размера, пожалуйста, удалите
^
в начале шаблона и$
в конце.
Ответ №4:
Редактировать — Для большей полноты вы могли бы сделать это:
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
Ответ №5:
[a-zA-Z0-9]{6}_[a-f0-9]{32}_[a-f0-9]{32}_[0-9] _[0-9] _[0-9]
ссылка: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
кроме того, поскольку php использует PCRE (регулярные выражения, совместимые с Pearl), вы можете использовать эту отличную шпаргалку: http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet /