Валидация международного идентификатора ресурса - PullRequest
1 голос
/ 12 января 2009

Проверка URI для RFC 3986 довольно проста. Вы можете использовать регулярное выражение , например :

/^                                                     # Start at the beginning of the text
([a-z][a-z0-9\*\-\.]*):\/\/                            # The scheme
(?:                                                    # Userinfo (optional)                                              
  (?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)*
  (?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@
)?
(?:                                                    # The domain
  (?:[a-z0-9\-\.]|%[0-9a-f]{2})+                       # Domain name or IPv4
  |(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\])        # or IPv6
)
(?::[0-9]+)?                                           # Server port number (optional)
(?:[\/|\?]
  (?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2}) # The path (optional) 
*)?
$/xi

Но это не работает для международных символов, подобных тем, которые встречаются в международных доменных именах. Например, http://例え.テスト/メインページ.

Используя что-то вроде

filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED);

тоже не работает. Эта проблема связана с используемыми символами.

Есть ли хороший способ проверки URI в PHP?

1 Ответ

1 голос
/ 13 января 2009

С preg_match \ pL будет соответствовать любая буква Юникода. Поэтому замените a-z на \ pL. И 0-9 с \ пн. См. Подробности регулярного выражения для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...