2013-03-05 3 views
3

Мне нужно проверить строку, которая может содержать символы нижнего регистра и тире, но не в начале, не в конце и не повторяться. Тогда могут быть и номера, но не в начале.preg-match для повторяющихся символов

Вот как это должно работать:

Match: ab9cd-a9bc-abbbc95 
Not match: 5abcd 
Not match: abbcd- 
Not match: -abcd 
Not match: abcd--abcd 

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

У меня есть это:

/^[a-z]+[a-z0-9\-]+[a-z0-9]$/ 

И я попытался это, но не работает, как ожидалось:

/^[a-z]+[a-z0-9\-?]+[a-z0-9]$/ 
+1

По говорю g "имеют строчные символы и тире, но не в начале и в конце и не повторяются", вы имеете в виду, что только тире подвергаются «не в начале, не в конце или повторном» ограничении? – Passerby

ответ

0

Как насчет:

^[a-z][a-z0-9]*(?:-?[a-z0-9]+)*[a-z0-9]$ 

пример:

$arr = array('ab9cd-a9bc-abbbc95','5abcd','abbcd-','-abcd','abcd--abcd'); 
foreach($arr as $str) { 
    if (preg_match('/^[a-z][a-z0-9]*(?:-?[a-z0-9]+)*[a-z0-9]$/', $str)) { 
     echo "OK : $str\n"; 
    } else { 
     echo "KO : $str\n"; 
    } 
} 

выход:

OK : ab9cd-a9bc-abbbc95 
KO : 5abcd 
KO : abbcd- 
KO : -abcd 
KO : abcd--abcd 

объяснение: (от Япе :: Regex :: Объяснить)

The regular expression: 

(?-imsx:^[a-z][a-z0-9]*(?:-?[a-z0-9]+)*[a-z0-9]$) 

matches as follows: 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
(?-imsx:     group, but do not capture (case-sensitive) 
         (with^and $ matching normally) (with . not 
         matching \n) (matching whitespace and # 
         normally): 
---------------------------------------------------------------------- 
^      the beginning of the string 
---------------------------------------------------------------------- 
    [a-z]     any character of: 'a' to 'z' 
---------------------------------------------------------------------- 
    [a-z0-9]*    any character of: 'a' to 'z', '0' to '9' 
          (0 or more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    (?:      group, but do not capture (0 or more times 
          (matching the most amount possible)): 
---------------------------------------------------------------------- 
    -?      '-' (optional (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    [a-z0-9]+    any character of: 'a' to 'z', '0' to '9' 
          (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
)*      end of grouping 
---------------------------------------------------------------------- 
    [a-z0-9]     any character of: 'a' to 'z', '0' to '9' 
---------------------------------------------------------------------- 
    $      before an optional \n, and the end of the 
          string 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 
0

Я надеюсь, что это один решить ваша проблема

/^[a-z0-9]+((\-{0,1})[a-z0-9]+)+$/ 

Отредактировано:

После более подходит

/^[a-z]+[a-z0-9]+((\-{0,1})[a-z0-9]+)+$/ 
+0

'{1}' там нет смысла –

+0

@ka ᵠ Что вы подразумеваете под «бессмысленным». В любом случае я отредактировал мое сообщение. Благодарю. –

+0

'-' в одиночку будет соответствовать 1 тире, не нужно« форсировать »ограничение до 1 символа с помощью' {1} ' –

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