Создание регулярного выражения url global

Я искал регулярное выражение для замены простого текста url в строке (строка может содержать более 1 URL-адреса):

<a href="url">url</a> 

и я нашел это: http://mathiasbynens.be/demo/url-regex

Я хотел бы использовать регулярное выражение diegoperini (которое по результатам тестов является лучшим):

 _^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[az\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS 

Но я хочу сделать глобальным, чтобы заменить все URL-адреса в строке. Когда я использую это:

 /_(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[az\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?_iuS/g 

Это не работает, как мне сделать это регулярное выражение глобальным, и что означает подчеркивание в начале и «_iuS», в конце?

Я хотел бы использовать его с php, поэтому я использую:

 preg_replace($regex, '<a href="$0">$0</a>', $examplestring); 

Подчерки – это разделители регулярных выражений, i, u и S – модификаторы шаблонов:

i (PCRE_CASELESS)

 If this modifier is set, letters in the pattern match both upper and lower case letters. 

U (PCRE_UNGREEDY)

 This modifier inverts the "greediness" of the quantifiers so that they are not greedy by default, but become greedy if followed by ?. It is not compatible with Perl. It can also be set by a (?U) modifier setting within the pattern or by a question mark behind a quantifier (eg .*?). 

S

 When a pattern is going to be used several times, it is worth spending more time analyzing it in order to speed up the time taken for matching. If this modifier is set, then this extra analysis is performed. At present, studying a pattern is useful only for non-anchored patterns that do not have a single fixed starting character. 

Для получения дополнительной информации см. http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

Когда вы добавили / … / g, вы добавили еще один разделитель регулярных выражений плюс модификатор g, которого не существует в PCRE, поэтому он не работал.

Я согласен с @verdesmarald и использовал этот шаблон в следующей функции:

 $string = preg_replace_callback( "_(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[az\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?_iuS", create_function('$match',' $m = trim(strtolower($match[0])); $m = str_replace("http://", "", $m); $m = str_replace("https://", "", $m); $m = str_replace("ftp://", "", $m); $m = str_replace("www.", "", $m); if (strlen($m) > 25) { $m = substr($m, 0, 25) . "..."; } return "<a href=\"$match[0]\">$m</a>"; '), $string); return $string; 

Кажется, он делает трюк и решает вопрос, который у меня был. Как сказал @verdesmarald, удаление символов ^ и $ позволило шаблону работать даже в моем pre_replace_callback ().

Единственное, что касается меня, – это то, насколько эффективна модель. Если он используется в веб-приложении с занятым / высоким трафиком, может ли это вызвать бутылочную шее?

ОБНОВИТЬ

Вышеупомянутый шаблон регулярного выражения ломается, если в конце участка пути URL-адреса есть точка пути, например http://www.mydomain.com/page. , Чтобы решить эту проблему, я модифицировал заключительную часть шаблона регулярного выражения, добавив ^. в результате чего финальная часть выглядит так [^\s^.] . Когда я прочитал это, не совпадают с конечным пространством или точкой.

В моих тестах пока это работает нормально.