Я искал и искал, играл и играл с ним, и хотя он не идеален, он может помочь другим, пытающимся проверить имя и фамилию, которые были предоставлены как одна переменная.
В моем случае это переменная $ name.
Я использовал следующий код для своего PHP:
if (preg_match('/\b([A-Z]{1}[a-z]{1,30}[- ]{0,1}|[A-Z]{1}[- \']{1}[A-Z]{0,1}
[a-z]{1,30}[- ]{0,1}|[a-z]{1,2}[ -\']{1}[A-Z]{1}[a-z]{1,30}){2,5}/', $name)
# there is no space line break between in the above "if statement", any that
# you notice or perceive are only there for formatting purposes.
#
# pass - successful match - do something
} else {
# fail - unsuccessful match - do something
Я сам изучаю RegEx, но у меня есть объяснение кода, предоставленное приятелем RegEx.
Вот:
Утвердить позицию на границе слова «\ b»
Сопоставьте указанное ниже регулярное выражение и зафиксируйте его соответствие с номером обратной ссылки 1
«([AZ] {1} [az] {1,30} [-] {0,1} | [AZ] {1} [- \ '] { 1} [AZ] {0,1} [az] {1,30} [-] {0,1} | [az] {1,2} [- \ '] {1} [AZ] {1} [ AZ] {1,30}) {2,5} »
От 2 до 5 раз, как можно больше раз, отдавая по мере необходимости (жадно) «{2,5}»
* МНЕ НУЖДАЕТСЯ ЗДЕСЬ ПОМОЩЬ В ПОНИМАНИИ РАСШИРЕНИЯ ДАННОЙ ЗАПИСИ *
Примечание: я повторил саму группу захвата. Группа захватит только последнюю итерацию. Поместите группу захвата вокруг повторяющейся группы, чтобы захватить все итерации. «{2,5}»
Сопоставьте любое из приведенных ниже регулярных выражений (попытка следующей альтернативы только в случае неудачи) «[AZ] {1} [az] {1,30} [-] {0,1}»
Соответствует одному символу в диапазоне от «A» до «Z» «[AZ] {1}»
Ровно 1 раз «{1}»
Соответствует одному символу в диапазоне от «a» до «z» «[az] {1,30}»
От одного до 30 раз, как можно больше раз, отдавая по мере необходимости (жадно) «{1,30}»
Соответствует одному символу из списка «-» «[-] {0,1}»
От нуля до единицы, столько раз, сколько возможно, отдавая по мере необходимости (жадно) «{0,1}»
Или сопоставьте регулярное выражение номер 2 ниже (попытка следующей альтернативы только в случае неудачи) «[AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1} »
Соответствует одному символу в диапазоне от «A» до «Z» «[AZ] {1}»
Ровно 1 раз «{1}»
Соответствует одному символу, присутствующему в списке ниже «[- \ '] {1}»
Ровно 1 раз «{1}»
Один из символов «-» «-» A 'символ «\'»
Соответствует одному символу в диапазоне от «A» до «Z» «[AZ] {0,1}»
От нуля до единицы, столько раз, сколько возможно, отдавая по мере необходимости (жадно) «{0,1}»
Соответствует одному символу в диапазоне от «a» до «z» «[az] {1,30}»
От одного до 30 раз, как можно больше раз, отдавая по мере необходимости (жадно) «{1,30}»
Соответствует одному символу из списка «-» «[-] {0,1}»
От нуля до единицы, столько раз, сколько возможно, отдавая по мере необходимости (жадно) «{0,1}»
Или сопоставьте регулярное выражение номер 3 ниже (вся группа не справится, если это не соответствует) «[az] {1,2} [- \ '] {1} [AZ] {1} [az] {1,30} »
Соответствует одному символу в диапазоне от «a» до «z» «[az] {1,2}»
От одного до двух раз, как можно больше раз, отдавая по мере необходимости (жадно) «{1,2}»
Соответствует одному символу в диапазоне от «» до «'» «[- \'] {1}»
Ровно 1 раз «{1}»
Соответствует одному символу в диапазоне от «A» до «Z» «[AZ] {1}»
Ровно 1 раз «{1}»
Соответствует одному символу в диапазоне от «a» до «z» «[az] {1,30}»
От одного до 30 раз, как можно больше раз, отдавая по мере необходимости (жадно) «{1,30}»
Я знаю, что эта проверка полностью предполагает, что каждый человек, заполняющий форму, имеет западное имя, и это может исключить подавляющее большинство людей в мире. Однако я считаю, что это шаг в правильном направлении. Возможно, это регулярное выражение слишком простое, чтобы гуру могли его упрощенно рассматривать, или, может быть, есть какая-то другая причина, по которой мне не удалось найти приведенный выше код в моих поисках. Я потратил слишком много времени, пытаясь разобраться в этом вопросе, вы, вероятно, заметите, насколько я туманный, если вы посмотрите на названия моих тестов ниже.
Я протестировал код на следующих именах, и результаты указаны в скобках справа от каждого имени.
- СТИВ СМИТ (неудачно)
- Stev3 Smith (провал)
- Стив Смит (неудача)
- Стив Смит (неудача)
- Стив См1 (сдал Стива См)
- d'Are to Beaware (передано в Are to Beaware)
- Джо Блоу (пройдено)
- Хён Кён У (сдано)
- Майк О'Нил (прошел)
- Стив Джонсон-Смит (пас)
- Йозеф-Шмозев Гимдель (сдан)
- О Генри Смит (пройден)
- Матаис д'Аррас (прошел)
- Мартин Лютер Кинг младший (прошел)
- Центр города-Джеймс Браун (пройден)
- Даррен Маккарти (прошел)
- Джордж Де ФанкМастер (сдано)
- Kurtis B-Ball Basketball (пас)
- Ахмад эль Джефф (прошел)
Если у вас есть базовые имена, их должно быть от одного до пяти, чтобы приведенный выше код работал, которые похожи на те, которые я использовал во время тестирования, этот код может быть для вас.
Если у вас есть какие-либо улучшения, дайте мне знать. Я только нахожусь на ранней стадии (первые несколько месяцев выяснения RegEx.
Спасибо и удачи, Стив