2017-02-02 15 views
0
$nomadspage = "http://www.nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/";  
    $html = file_get_contents($nomadspage); 
    $count = preg_match_all('/<a href="([^"]+)">[^<]*<\/a>/i', $html, $files); 

    unset($files[1]); //deletes repeat array from preg_match 
    $files = $files[0]; //deletes container array from preg_match 

    foreach ($files as $key => $value) { 
     if (substr($value, 0, 3) !== "gfs") { 
      unset($files[$key]); 
     } 
    } 

    var_dump($files); 

У меня есть массив с именами файлов из каталога HTTP. Я хочу отфильтровать имена этих файлов, чтобы все файлы, которые не начинались с трех букв gfs, удаляются из массива. Однако по какой-либо причине функция substr() не работает. Он не вытягивает подстроку из имен файлов. Следовательно, инструкция if не работает. Кто-нибудь знает, почему это происходит и как это исправить?substr() PHP не работает для элементов массива

+0

Можете ли вы дать нам подмножество массива '$ files'? – forrestmid

+1

Должна быть проблемой 'preg_match_all()'. Например, вы не получаете результаты, о которых думаете. Возможно, вам следует использовать [DOMDocument] (http://php.net/manual/en/class.domdocument.php), когда вы все равно разбираете HTML. Еще лучше, я уверен, что информация NOAA доступна как ответ JSON где-то. – PHPglue

ответ

3

$files[0] содержит строки, соответствующие всему регулярному выражению, поэтому substr($value, 0, 3) всегда "<a ". Вы должны установить $files в $files[1], а не $files[0], он содержит все совпадения шаблона ([^"]+).

На самом деле, лучше не использовать регулярные выражения для анализа HTML. Используйте библиотеку парсеров DOM, например класс DOMDocument.

+0

Thx, отлично работает :) –