Регулярные выражения, разрешают только определенный формат. "Джон Доу"
Я немного исследовал, но не нашел ничего, что точно относилось бы к тому, что мне нужно, и всякий раз, когда я пытался создать выражение, оно всегда немного отличалось от того, что мне нужно.
Я попытался сделать что-то в духе [AZaz09]{3,8}-[AZaz09]{3,8}
.
Я хочу, чтобы действительный результат допускал только текст-текст, где либо или текст может быть алфавитным или числовым, однако единственным допустимым символом является -
, и это находится между двумя текстами.
Каждый текст должен содержать не менее трех символов. ({3,8}?), затем разделяется на -
.
Поэтому для того, чтобы это было действительно, некоторые примеры могут быть:
Text-Text
Abc-123
123-Abc
A2C-def4gk
Недопустимыми тестами могут быть:
Ab-3
Abc!-ajr4
a-bc3-25aj
a?c-b%
6 ответов:
Вам нужно использовать якоря и использовать
-
, чтобы символы в классе символов считывались как диапазон, а не отдельные символы.Попробуйте:
^[A-Za-z0-9]{3,8}-[A-Za-z0-9]{3,8}$
Демо: https://regex101.com/r/xH3oM8/1
Вы также можете упростить его, но с модификатором
i
и метасимволом\d
.(?i)^[a-z\d]{3,8}-[a-z\d]{3,8}$
Если должны быть разрешены буквы с ударением или любая другая буква, существующая в диапазоне Unicode (например, греческие или кириллические буквы), то используйте
u
модификатор (для поддержки UTF-8) и\pL
чтобы соответствовать буквам Юникода (и\d
для цифр):$string =" Mañana-déjà Text-Text Abc-123 123-Abc A2C-def4gk Ab-3 Abc!-ajr4 a-bc3-25aj a?c-b%"; $regex='/^[\pL\d]{3,}-[\pL\d]{3,}$/mu'; preg_match_all($regex, $string, $matches); var_export($matches);
Вывод:
array ( 0 => array ( 0 => 'Mañana-déjà', 1 => 'Text-Text', 2 => 'Abc-123', 3 => '123-Abc', 4 => 'A2C-def4gk', ), )
NB: разница с
\w
заключается в том, что[\pL\d]
не будет соответствовать подчеркиванию.
Вы можете придумать следующее:
<?php $string =" Text-Text Abc-123 123-Abc A2C-def4gk Ab-3 Abc!-ajr4 a-bc3-25aj a?c-b%"; $regex='~ ^\w{3,} # at last three word characters at the beginning of the line - # a dash \w{3,}$ # three word characters at the end of the line ~xm'; # multiline and freespacing mode (for this explanation) # ~xmu for accented characters preg_match_all($regex, $string, $matches); print_r($matches); ?>
Как указал @chris85,
\w
также будет соответствовать подчеркиванию. У тринко был хороший комментарий (то есть совпадение акцентированных символов). Чтобы достичь этого, просто используйте модификаторu
.
Смотрите демонстрацию на regex101.com и полный код на ideone.com .
Вы можете использовать это регулярное выражение
^\w{3,}-\w{3,}$ ^ // start of the string \w{3,} // match "a" to "z", "A" to "Z" and 0 to 9 and requires at least 3 characters - // requires "-" \w{3,} // same as above $ // end of the string
Демонстрация Регулярных Выражений
И короткий.
^([^\W_]{3,8})-(?1)$
[^\W_]
можно использовать как сокращение от alnum. Он вычитает подчеркивание из\w
(?1)
является вызовом подпрограммы к шаблону в первой группеМой голос за @chris85, который наиболее очевиден и эффективен.