2015-05-01 4 views
0

Я хочу знать условие preg_match в PHP, чтобы проверить, начинается ли строка с месяца (с января по декабрь) и заканчивается двоеточием (:). Между ними может быть любой алфавит, символ или номер. Кто-то может помочь? Застрял в течение часа, не получая правильных результатов.Соответствие шаблону Regex в PHP

Например, строка "December 2,&*&98hkjk:" должна возвращать значение true.

Я получил шаблон для месяца и колона, используя txt2re.com, но я не знаю, как его сформировать и проверить результат.

$txt='May k!ur2!3:'; 

    $re1='((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Sept|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?))'; # Month 1 
    $re2='.*?'; # Non-greedy match on filler 
    $re3=':'; # Uninteresting: c 
    $re4='.*?'; # Non-greedy match on filler 
    $re5='(:)'; # Any Single Character 1 

    if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5."/is", $txt, $matches)) 
    { 
     $month1=$matches[1][0]; 
     $c1=$matches[2][0]; 
     echo "Matched \n"; 
    } 
    else { echo "No match"; } 

ПОЛУЧИЛ РЕШЕНИЕ:

$txt=$_POST['wtfb']; 
     $re1='((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Sept|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?))'; # Month 1 
     $re4='.*?'; # Non-greedy match on filler 
     $re5='(:)'; # Any Single Character 1 

     if ($c=preg_match_all ("/".$re1.$re4.$re5."/is", $txt, $matches)) 
     { 
      $month1=$matches[1][0]; 
      $c1=$matches[2][0]; 
      echo 'Match'; 
     } 
     else 
     { 
      echo 'No match'; 
     } 
+0

Показывать ваши попытки. Спросите, на что вы застряли. – Amadan

+0

Пожалуйста, разместите шаблон регулярного выражения, который вы пробовали. –

+0

'$ re3' и' $ re5' совпадают с символом двоеточия, поэтому он будет соответствовать только тогда, когда есть два двоеточия. В вашем примере есть только один двоеточие. – Barmar

ответ

1

Вы можете использовать strpos, чтобы проверить слово в строке.

$str = "December 2,&*&98hkjk:"; 

//Check for `December` 
if(strpos($str, 'December') !== false) { // use === for type comparison 
    //do your stuff 
    echo 'Match'; 
}else{ 
    echo 'No Match'; 
} 

strpos() в гораздо более простое решение для этого.

Эта функция может возвращать Boolean FALSE, но также может возвращать небулево значение, которое оценивается как FALSE. Пожалуйста, прочитайте раздел о Booleans для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.

+1

Итак, 12 "если" условия + сценарии с нижним регистром? –

+0

Если случай не имеет значения, вы можете 'if (strpos (strtolower ($ str), 'december')! == false)' и всегда передавать нижний регистр – Saqueib

+0

Не знаете, как это сделать в php, но я бы создал массив месяцев и для каждого цикла их в javascript. –

0

Вы хотите шаблон, как это (неполное, добавить оставшиеся месяцы в ...):

"/^(January|February|March|...|December).*:$/" 

Примечание я добавил начало и конец строковых якорей ^ и $, потому что вы сказали, что строка начинается с месяца и заканчивается двоеточием. Но ваше использование preg_match_all немного сбивает с толку, если вам нужно сопоставить кратность этого же шаблона в одной строке, это неправильное решение.

Смежные вопросы