preg_match_all возвращает только первое совпадение

Хорошо, поэтому в основном я пытаюсь пройти через большое количество html-кода, содержащего гиперссылки на файлы. Я использую preg_match_all, чтобы найти все вхождения. Однако он никогда не возвращает ожидаемое количество матчей.

Выстрел HTML-код (значение $ content):

<a class="file_download file_ext_docx" href="/download.php?f=/LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx">Download file 1.docx</a><br /><em>Some text<a class="file_download file_ext_docx" href="/download.php?f=/BP3/Referenties.docx">Download file 2.docx</a> </strong><br /><strong>- Some text: <a class="file_download file_ext_docx" href="/download.php?f=/Zelfevaluatie%204.2.docx">Download file 3.docx</a> Soem text: <a class="file_download file_ext_docx" href="/download.php?f=/BP3/sz-lio.docx">Download file 4</a> </strong><br /><a class="file_download file_ext_docx" href="/download.php?f=/BP3/poplio.docx"> 

PHP-код:

 preg_match_all('/download\.php\?f=(.*?)">/', $content, $matches); foreach($matches as $val){ echo $val[0] ."<br />"; } 

Приведенный выше код возвращает только первое совпадение для меня. Как ни странно, эхом:

 echo $val[1] ."<br />"; //Returns 2nd match echo $val[2] ."<br />"; //Returns 3rd match //etc 

Поэтому я решил, что должен просто подсчитать массив и обернуть его в цикле for, чтобы решить эту проблему. Однако:

 count($matches); //Returns 1 

Related of "preg_match_all возвращает только первое совпадение"

Во-первых, вы должны внимательно прочитать документацию php.net http://php.net/manual/en/function.preg-match-all.php

Но в резюме preg_match_all помещает $ в соответствие с результатами, зависящими от используемого вами флага: PREG_PATTERN_ORDER по умолчанию, поэтому массив $ matches должен быть

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

в твоем случае:

 Array ( [0] => Array ( [0] => download.php?f=/LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx"> [1] => download.php?f=/BP3/Referenties.docx"> [2] => download.php?f=/Zelfevaluatie%204.2.docx"> [3] => download.php?f=/BP3/sz-lio.docx"> [4] => download.php?f=/BP3/poplio.docx"> ) [1] => Array ( [0] => /LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx [1] => /BP3/Referenties.docx [2] => /Zelfevaluatie%204.2.docx [3] => /BP3/sz-lio.docx [4] => /BP3/poplio.docx ) ) 

Поэтому, если вы хотите перечислить все результаты, вы можете просто сделать

 foreach($matches[0] as $val){ echo $val ."<br />"; } 

Ваша картина правильная, но вы смотрите не в то место
когда я сбрасываю результат, я нашел его в порядке:

 array(2) { [0]=> array(5) { [0]=> string(75) "download.php?f=/LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx">" [1]=> string(38) "download.php?f=/BP3/Referenties.docx">" [2]=> string(42) "download.php?f=/Zelfevaluatie%204.2.docx">" [3]=> string(33) "download.php?f=/BP3/sz-lio.docx">" [4]=> string(33) "download.php?f=/BP3/poplio.docx">" } [1]=> array(5) { [0]=> string(58) "/LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx" [1]=> string(21) "/BP3/Referenties.docx" [2]=> string(25) "/Zelfevaluatie%204.2.docx" [3]=> string(16) "/BP3/sz-lio.docx" [4]=> string(16) "/BP3/poplio.docx" } }