Согласовывать массивы внутри массива - PullRequest
0 голосов
/ 20 июля 2010

Когда я выполняю регулярное выражение

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

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

Как договориться о массивах внутри других массивов

Ответы [ 3 ]

0 голосов
/ 20 июля 2010

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

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

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

$result = array_keys(array_flip($turls[0]));
0 голосов
/ 21 июля 2010

По умолчанию 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
0 голосов
/ 20 июля 2010

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

$urls = preg_match_all('~(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)~', $content, $matches) ? $matches[0] : array();
if ( count($urls) ) {
    ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...