По умолчанию preg_match_all () использует флаг PREG_PATTERN_ORDER, что означает:
Приказывает результаты, так что $ соответствует [0]
массив полных совпадений с образцами,
$ match 1 - массив строк
соответствует первым в скобках
subpattern и т. д.
См. http://php.net/preg_match_all
Вот пример вывода:
array(
0 => array( // Full pattern matches
0 => 'http://www.w3.org/TR/html4/strict.dtd',
1 => ...
),
1 => array( // First parenthesized subpattern.
// In your case it is the same as full pattern, because first
// parenthesized subpattern includes all pattern :-)
0 => 'http://www.w3.org/TR/html4/strict.dtd',
1 => ...
),
2 => array( // Second parenthesized subpattern.
0 => 'www.w3.org',
1 => ...
),
...
)
Итак, как R. Hill ответил, вам нужно $ match [0], чтобы получить доступ ко всем совпавшим URL.
И, как указал budinov.com , вы должны удалить внешние скобки, чтобы избежать дублирования второго совпадения с первым, например:
preg_match_all('~https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?~', $content, $turls);
// where $turls[0] is what you need