Я ищу универсальное регулярное выражение, которое извлекает имя пользователя Twitter из URL-адреса.
Пример URLS
http://www.twitter.com/#!/donttrythis
http://twitter.com/KimKardashian
Я ищу универсальное регулярное выражение, которое извлекает имя пользователя Twitter из URL-адреса.
Пример URLS
http://www.twitter.com/#!/donttrythis
http://twitter.com/KimKardashian
Попробуйте следующее:
^https?://(www\.)?twitter\.com/(#!/)?(?<name>[^/]+)(/\w+)*$
Подгруппа "имя" будет содержать имя пользователя Twitter.
Это регулярное выражение предполагает, что каждый URL-адрес находится в отдельной строке.
Чтобы использовать его в JS, используйте это:
^https?://(www\.)?twitter\.com/(#!/)?([^/]+)(/\w+)*$
Результат находится в подгруппе $3.
Есть еще несколько тестовых примеров для создания универсального регулярного выражения.
https
URL-адреса также действительныtwitter.com/@username
, также попадают в профиль имени пользователяЭто должно сделать трюк в PHP
preg_match("|https?://(www\.)?twitter\.com/(#!/)[email protected]?([^/]*)|", $twitterUrl, $matches);
Если preg_match
возвращает 1 (совпадение), то результат находится на $matches[3]
это регулярное выражение отлично работает в jQuery
$('#inputTwitter').blur(function() {
var twitterUserName = $(this).val();
$(this).val(twitterUserName.match(/https?:\/\/(www\.)?twitter\.com\/(#!\/)[email protected]?([^\/]*)/)[3])
});
Ломбо-ответ - мой любимый, но он запустит любую строку запроса с результатом:
http://www.twitter.com/#!/donttrythis?source=internet
приведет к имени пользователя "donttrythis? source = internet"
Я бы изменил его следующим образом:
preg_match("|https?://(www\.)?twitter\.com/(#!/)[email protected]?([^/\?]*)|", $twitterUrl, $matches);
Добавление \?
в класс исключенных символов после того, как имя пользователя гарантирует исключение строки запроса.
Это основано на ответе Ломбо, работает без http (s) тоже, менее голоден (не сохраняя пробелы после имени пользователя) и возвращает сначала результат.
Проверьте его в действии: https://regex101.com/r/xI2vF3/3
Для js:
(?:https?:\/\/)?(?:www\.)?twitter\.com\/(?:#!\/)[email protected]?([^\/\?\s]*)
Это регулярное выражение соответствует всем четырем указанным URL-адресам. Имя пользователя присутствует в $1
m[twitter\.com/+(?:#!/+)?(\w+)]
Используйте это, чтобы проверить
perl -le '$_="<url>"; m[twitter\.com/+(?:#!/+)?(\w+)]; print $1'
Это работает для меня (в PHP): /twitter\.com(?:\/\#!)?\/(\w+)/i
Я нашел, что Lombo отвечает за лучшее, за исключением того, что он не будет работать, если URL-адрес был www.twitter.com/example. Следующее работает для меня и на www.
$dirty_twitter = array( 'https://twitter.com/', 'http://twitter.com/', 'www.twitter.com/', 'https://www.twitter.com/', 'http://www.twitter.com/', 'twitter.com/' );
$clean_twitter = str_replace( $dirty_twitter, '', $clean_twitter );