регулярное выражение с ивритом или английским языком

Я ищу шаблон, который принимает только еврейские или английские буквы от 2 до 15 букв и может принимать 1 пробел. Я пробовал следующий код, но он не соответствует моей строке:

<?php
$subject = "שלום לך";
$regexp="#^\p[{Hebrew}| ][a-zA-Z]{2,15}? \+$#u";
print_r(preg_match($regexp, $subject));
?>

person ofir    schedule 08.02.2012    source источник
comment
Примечание. Аналогичное регулярное выражение можно использовать и в других диалектах регулярного выражения, т.е. для C#/.Net это IsHebrew вместо этого.   -  person Alexei Levenkov    schedule 26.09.2014


Ответы (2)


В вашем коде несколько ошибок.

Во-первых, ваше регулярное выражение

$regexp="#^\p[{Hebrew}| ][a-zA-Z]{2,15}? \+$#u";

Вот что это значит:

#                     : regex delimiter
  ^                   : begining of string
    \p                : character p
    [{Hebrew}| ]      : character class, one of the char : {, H, e, b, r, w, }, |, space 
    [a-zA-Z]{2,15}?   : from 2 to 15 alphabetic char
     \+               : a space followed by +
  $                   : end of string
#                     : regex delimiter
u                     : unicode

Unicode древнееврейский символ: \p{Hebrew}
нет необходимости в | внутри класса char
в вашей строке нет +, нет пробела в конце
нет необходимости выполнять нежадное сопоставление

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

$regexp="#^[\p{Hebrew} a-zA-Z]{2,15}$#u";

пояснение:

#                 : regex delimiter
  ^               : begining of string
    [             : start class character
      \p{Hebrew}  : a hebrew character
                  : a space
      a-zA-Z      : a latin letter
    ]             : end of class
    {2,15}        : previous chars 2 to 15 times
  $               : end of string
#                 : regex delimiter
u                 : unicode

preg_match возвращает не массив, а целое число, содержащее количество время нахождения шаблона в строке.

Тогда ваш скрипт становится:

$subject = "שלום לך";
$regexp  = "#^[\p{Hebrew} a-zA-Z]{2,15}$#u";
preg_match($regexp, $subject, $m);
print_r($m);
person Toto    schedule 11.02.2012

Как насчет этого? Доза, которая работает для вас?

[\w\u0590-\u05FF]
person Mbrevda    schedule 08.02.2012