Regex, чтобы позволить AZ, - и ' - PullRequest
0 голосов
/ 12 сентября 2011

Я пытаюсь заставить это регулярное выражение работать для проверки поля имени, чтобы разрешить только A-Z, 'и -.

Пока что я использую это, которое отлично работает, за исключением того, что не допускает апострофа.

if (preg_match("/[^a-zA-Z'-]+/",$firstname)) {
            // do something
        }

Я бы хотел, чтобы разрешались только A-Z, - (тире) и '(апостроф). Это работает для A-Z и - но все еще не будет работать для '

Может ли кто-нибудь привести пример?

Спасибо

Ответы [ 6 ]

2 голосов
/ 12 сентября 2011

Ваш код уже делает то, что вы хотите:

<?php

$data = array(
    // Valid
    'Jim',
    'John',
    "O'Toole",
    'one-two',
    "Daniel'Blackmore",

    // Invalid
    ' Jim',
    'abc123',
    '$@#$%@#$%&*(*&){}//;;',

);

foreach($data as $firstname){
    if( preg_match("/[^a-zA-Z'-]+/",$firstname) ){
        echo 'Invalid: ' . $firstname . PHP_EOL;
    }else{
        echo 'Valid: ' . $firstname . PHP_EOL;
    }
}

... отпечатки:

Valid: Jim
Valid: John
Valid: O'Toole
Valid: one-two
Valid: Daniel'Blackmore
Invalid:  Jim
Invalid: abc123
Invalid: $@#$%@#$%&*(*&){}//;;

Одинарная кавычка не имеет никакого особого значения в регулярных выражениях, поэтому она не нуждается в особой обработке. Знак минус (-), находящийся внутри [], означает диапазон ; если вам нужен литерал -, это должен быть первый или последний символ, как в вашем коде.

Сказал, что ошибка (если есть) где-то еще.

2 голосов
/ 12 сентября 2011
if (preg_match("/^[A-Z'-]+$/",$firstname)) {
    // do something
}

Знак ^ внутри класса персонажа [] будет отменять совпадение.Как у вас есть, это означает, что $firstname содержит символы, отличные от a-z, A-Z, ' и -.

1 голос
/ 12 сентября 2011

Из того, что я вижу. Следующее регулярное выражение должно работать нормально:

if (preg_match("/^[A-Z\'\-]+$/",$firstname)) {
    // do something
}

Здесь я избежал и апострофа, и черты. Я проверил это в онлайн-тестере Regex и отлично работает.

Попробуйте

1 голос
/ 12 сентября 2011

"/[^a-zA-Z'-]+/" на самом деле соответствует всему, кроме a-zA-z'-, если вы поставите ^ в, чтобы указать начало строки, вы должны поставить его за скобки.Кроме того, часть '- вашего выражения, возможно, интерпретируется как диапазон, поэтому вы должны избегать - при ответе @Tom или избегать ,, как кто-то ответил

0 голосов
/ 05 марта 2019
if (preg_match("/^[a-zA-Z -]*$/", $firstname)) {
    // do something here
}

Я использовал это, это будет работать нормально.Используй это.

0 голосов
/ 12 сентября 2011

Ваше регулярное выражение должно выглядеть следующим образом:

preg_match("/^[A-Z\'-]+$/",$firstname);

maches: AB A-B AB-'

не соответствует: Ab a-B AB# <empty string>

...