Я использую cURL, чтобы вытащить содержимое удаленного сайта. Мне нужно проверить все атрибуты «href =» и определить, являются ли они относительным или абсолютным путем, затем получить значение ссылки и перейти к чему-то вроде href = «http://www.website.com/index.php ? URL = [ABSOLUTE_PATH]»
Любая помощь будет принята с благодарностью.
Комбинация регулярного выражения * и HTML parse_url()
должно помочь:
// find all links in a page used within href="" or href='' syntax $links = array(); preg_match_all('/href=(?:(?:"([^"]+)")|(?:\'([^\']+)\'))/i', $page_contents, $links); // iterate through each array and check if it's "absolute" $urls = array(); foreach ($links as $link) { $path = $link; if ((substr($link, 0, 7) == 'http://') || (substr($link, 0, 8) == 'https://')) { // the current link is an "absolute" URL - parse it to get just the path $parsed = parse_url($link); $path = $parsed['path']; } $urls[] = 'http://www.website.com/index.php?url=' . $path; }
Чтобы определить, является ли URL-адрес абсолютным или нет, я просто проверяю, является ли начало URL-адреса http://
или https://
; если ваши URL-адреса содержат другие среды, такие как ftp://
или tel:
, вам также придется обрабатывать их.
Это решение действительно использует регулярное выражение для анализа HTML, на который часто нахмуривают. Чтобы обойти, вы можете переключиться на использование [DOMDocument][2]
, но нет необходимости в дополнительном коде, если нет никаких проблем.
Вот одно из возможных решений, если я правильно понял вопрос:
$prefix = 'http://www.website.com/index.php?url='; $regex = '~(<a.*?href\s*=\s*")(.*?)(".*?>)~is'; $html = file_get_contents('http://cnn.com'); $html = preg_replace_callback($regex, function($input) use ($prefix) { $parsed = parse_url($input[2]); if (is_array($parsed) && sizeof($parsed) == 1 && isset($parsed['path'])) { return $input[1] . $prefix . $parsed['path'] . $input[3]; } }, $html); echo $html;