2010-07-20 2 views
0

Когда я выполнять регулярное выражение,Обсудите массивы внутри массива

preg_match_all('~(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)~', $content, $turls); 
print_r($turls); 

я получил массив внутри массива. Мне нужен только один массив.

Как вести переговоры массивов внутри других массивов

+0

Что делает ваш 'print_r ($ turls)' печать? – BoltClock

+0

$ content - фактически file_get_contents («http://www.yahoo.com»); и поэтому preg_match_all извлекает ссылки с yahoo.com и хранится в массиве $ turls – Rajasekar

ответ

0

По умолчанию preg_match_all() использует PREG_PATTERN_ORDER флаг, что означает:

упорядочивает результаты так, что $ матчей [0] массив полного шаблона совпадает, соответствуют 1 $ представляет собой массив строк соответствует первой скобке подкоманды и т. Д.

См 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 ответил, что вам нужно $ матчей [0], чтобы получить доступ ко всем совпавшие URLs. И как budinov.com заостренный, вы должны удалить внешние скобки, чтобы избежать второго матча дублировать первый, например .:

preg_match_all('~https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?~', $content, $turls); 
// where $turls[0] is what you need 
0

Не уверен, что вы имеете в виду под «negociate». Если вы имеете в виду принести внутренний массив, который должен работать:

$urls = preg_match_all('~(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)~', $content, $matches) ? $matches[0] : array(); 
if (count($urls)) { 
    ... 
    } 
0

Как правило, вы можете заменить регулярное выражение с той, которая не содержит круглые скобки(). Таким образом, ваши результаты будут держать только в $ turls [0] переменная:

preg_match_all('/https?\:\/\/[^\"\'\s]+/i', file_get_contents('http://www.yahoo.com'), $turls); 

, а затем сделать некоторый код, чтобы сделать URLs уникальным, как это:

$result = array_keys(array_flip($turls[0]));