Использование регулярного выражения для извлечения URL-адресов из ссылок в HTML-документе - PullRequest
3 голосов
/ 24 июня 2011

Мне нужно захватить все ссылки в данном html.

Вот пример кода:

<div class="infobar">
    ... some code goes here ...
    <a href="/link/some-text">link 1</a>
    <a href="/link/another-text">link 2</a>
    <a href="/link/blabla">link 3</a>
    <a href="/link/whassup">link 4</a>
    ... some code goes here ...
</div>

Мне нужно получить все ссылки внутри div.infobar, который начинается с /link/

Я пробовал это:

preg_match_all('#<div class="infobar">.*?(href="/link/(.*?)") .*?</div>#is', $raw, $x);

, но это дает мне единственный первый матч.

Спасибо за советы.

Ответы [ 4 ]

7 голосов
/ 24 июня 2011

Я бы предложил использовать DOMDocument для этой цели, а не использовать регулярные выражения.Рассмотрим следующий простой код:

$content = '
<div class="infobar">
    <a href="/link/some-text">link 1</a>
    <a href="/link/another-text">link 2</a>
    <a href="/link/blabla">link 3</a>
    <a href="/link/whassup">link 4</a>
</div>';
$dom = new DOMDocument();
$dom->loadHTML($content);

// To hold all your links...
$links = array();

// Get all divs
$divs = $dom->getElementsByTagName("div");
foreach($divs as $div) {
  // Check the class attr of each div
  $cl = $div->getAttribute("class");
  if ($cl == "infobar") {
    // Find all hrefs and append it to our $links array
    $hrefs = $div->getElementsByTagName("a");
    foreach ($hrefs as $href)
       $links[] = $href->getAttribute("href");
  }
}
var_dump($links);

ВЫХОД

array(4) {
  [0]=>
  string(15) "/link/some-text"
  [1]=>
  string(18) "/link/another-text"
  [2]=>
  string(12) "/link/blabla"
  [3]=>
  string(13) "/link/whassup"
}
2 голосов
/ 24 июня 2011

http://simplehtmldom.sourceforge.net/:

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>'; 
2 голосов
/ 24 июня 2011

Пересмотр моего предыдущего ответа. Вам нужно сделать это в два этапа:

//This first step grabs the contents of the div.
preg_match('#(?<=<div class="infobar">).*?(?=</div>)#is', $raw, $x);

//And here, we grab all of the links.
preg_match_all('#href="/link/(.*?)"#is', $x[0], $x);
0 голосов
/ 24 июня 2011

Попробуйте это (я добавил +):

preg_match_all('#<div class="infobar">.*?(href="/link/(?:.*?)")+ .*?</div>#is', $raw, $x);
...