Невозможно распечатать только результат поиска после результата поиска отходов - PullRequest
1 голос
/ 19 мая 2019

Я использую Простой Html Dom . Я новичок в поиске в сети, я отбираю данные с booking.com У меня проблемы с печатью только URL-адреса результатов поиска. Мой код ниже

<?php

    include 'simple_html_dom.php';

    $searchText = "Venice";
    $searchText = str_replace(" ", "+", $searchText);

    $url = "https://www.booking.com/searchresults.en-gb.html?aid=1781605&lang=en-gb&sid=3bb432f656e368125330f71ea0e74e36&sb=1&src=index&src_elem=sb&error_url=https://www.booking.com/index.en-gb.html?aid=1781605;sid=3bb432f656e368125330f71ea0e74e36;sb_price_type=total;srpvid=dc2798d544dd007f&;&ss=".$searchText."&is_ski_area=0&ssne=".$searchText."&ssne_untouched=".$searchText."&dest_id=-132007&dest_type=city&checkin_year=2019&checkin_month=5&checkin_monthday=19&checkout_year=2019&checkout_month=5&checkout_monthday=20&group_adults=2&group_children=0&no_rooms=1&b_h4u_keep_filters=&from_sf=1";


    print $url."<br>";


    $html = file_get_html($url);

    $i = 0;

    $linkObjs = $html->find('a');

    foreach ($linkObjs as $linkObj) {

        $link  = trim($linkObj->href);

        /*if (!preg_match('/^https?/', $link) && preg_match('/^hotel/', $link, $matches) && preg_match('/^https?/', $matches[1])) {
            $link = matches[1];
        } else if (!preg_match('/^https?/', $link)) {
            continue;
        }*/

        if (!preg_match('/^https?/', $link)) {
            continue;
        }

        $i++;

        echo "Link: ". $link . "<br/><hr/>";

    }
?>

Теперь проблема в том, что я хочу напечатать ссылку на результат поиска, которая имеет /hotel/ путь в URL-адресе, например https://www.booking.com/hotel/it/nh-collection-venezia-palazzo-barocci.en-gb.html, теперь я не понимаю, как настроить preg_replace для печати только URL-адреса результата поиска и заголовка.

1 Ответ

1 голос
/ 19 мая 2019

Использование ^ в выражении означает утверждение начала строки, которую вы проверяете во втором предложении:

if (!preg_match('/^https?/', $link) && preg_match('/^hotel/', $link, $matches) && preg_match('/^https?/', $matches[1])) {

Если вы хотите использовать preg_match , вы можетеиспользуйте одно выражение, чтобы проверить, начинается ли строка с http с необязательным s:

^https?://.*?/hotel/
  • ^ Начало строки
  • https?:// Соответствие http, необязательноs, ://
  • .*? Соответствует любому символу, кроме новой строки без жадности
  • /hotel/ Соответствует буквально

Regex demo | Php demo

Например:

if (!preg_match('~^https?://.*?/hotel~', $link)) {
    continue;
}

Без использования регулярных выражений вы также можете использовать комбинацию substr и strpos

if (!(substr($link, 0, 4 ) === "http" && strpos($link, '/hotel/') !== false)) {
    continue;
}

Php демо

...