Регулярные выражения, разрешают только определенный формат. "Джон Доу"


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

Я попытался сделать что-то в духе [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   7  

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)$

Демо на regex101

Мой голос за @chris85, который наиболее очевиден и эффективен.

Этот

^([\w]{3,8}-[\w]{3,8})$

Https://regex101.com/r/uS8nB5/1