Как редактировать ссылку href (скребок) - PullRequest
1 голос
/ 10 января 2011

Я очищаю страницу, однако, прежде чем мой контент будет отображен, я хотел бы отредактировать ссылку.

Каков наилучший способ сделать это?

В настоящее время я использую Simple HTML DOM Parser:

// create HTML DOM
$html = file_get_html('http://myurl.com');
// remove all image
  foreach($html->find('img') as $e)
 $e->outertext = '';
foreach($html->find('font') as $e)
$e->outertext = '';
// find all td tags with attribite align=center
foreach($html->find('td[align=left]', 2) as $e)
   echo $e->innertext;

В одном из URL есть этот бит:

<a target="retailer" href="/cgi-bin/redirect.cgi?name=Storm%20Computers&amp;linkid=2&amp;newurl=http%3A%2F%2Fwww.stormcomputers.com.au%2Fcatalog%2Findex.php%3FcPath%3D38_364&amp;query=sandy%20bridge&amp;uca=208-0-0&amp;kwi=&amp;rpos=2" title="Storm Computers: Click to see item">$149.00</a>

Я хотел бы изменить это на

<a href="http%3A%2F%2Fwww.stormcomputers.com.au%2Fcatalog%2Findex.php%3FcPath%3D38_364&amp;query=sandy%20bridge&amp;uca=208-0-0&amp;kwi=&amp;rpos=2">$149.00</a>

(т. Е. Сразу после & newurl =)

Спасибо.

Ответы [ 3 ]

1 голос
/ 10 января 2011

Я не знаком с парсером, который вы используете, но что-то вроде этого может работать:

foreach ($html->find('a') as $link) {
    $urlparts = parse_url($link->href);
    $query = parse_str($urlparts['query'], $params);

    if (isset($params['newurl'])) {
        $link->href = $params['newurl'];
    }
}
0 голосов
/ 10 января 2011

Вы можете использовать регулярное выражение, чтобы найти все ссылки, а затем parse_url() и parse_str(), чтобы перестроить ссылку.

Например:

if (preg_match_all('/<a href="(.+)">(.+)<\/a>/i',$html,$matches)) {

  // at this point, $matches is a multidimensional array where
  // index 0 is an array of all matches of the full pattern,
  // and index 1 is an array of all captured links
  foreach ($matches[1] as $link) {

    // parse the link
    if ($parsed_link = parse_url($link)) {

      // see the documentation of parse_url() for the various
      // array keys produced by calling it; in this case we
      // are using the value of 'query' and passing it to
      // parse_str() which will break a url query string
      // into individual variables; pass $arguments as below
      // and it will populate the result into it as an array
      parse_str($parsed_link['query'],$arguments);

      // now, we want the value of the 'newurl' query parameter
      // from the original url
      if (isset($arguments['newurl'])) {

        $new_url = $arguments['newurl'];

        // do whatever you want with $new_url

      }

    }

  }

}

Это, конечно, не единственный способ сделать это, но есть некоторая ценность в использовании возможностей языка для согласованности и удобочитаемости.Я не особо задумывался над поиском ссылок в Регулярном выражении выше, поэтому он не обрабатывает никаких особых случаев.Если ссылки в вашем документе плохо сформированы, вам может потребоваться изменить это выражение для обработки лишних пробелов, неуместных кавычек и т. Д.

0 голосов
/ 10 января 2011

Найти ссылки с DOM.После этого просто используйте Explode, чтобы разбить строку href.

$split_href = explode('&amp;newurl=', $href);

if(count($split_href) > 1) {
    $newurl = $split_href[1];
}

Не думайте, что вам нужно регулярное выражение, потому что оно медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...