Intereting Posts
Предупреждение: session_start () : open (/tmp/sess_e07..42c14904, O_RDWR) Столбец не найден: 1054 Неизвестный столбец, используя соединение PHP-код для перенаправления, если поле mysql завершено Как добавить 5 минут к текущему дате времени на php <5.3 Преобразован ли BLOB с использованием текущей / дефолтной кодировки в MySQL? Как разрешить только один сеанс POST на сеанс браузера? API-драйв google разрешает PHP-массив: целочисленный индекс и индекс строки Как получить данные из разных связанных таблиц, используя сдерживаемые в CakePHP? Ошибка отправки Symfony2 SwiftMailer sendmail Использовать существующий javascript для запуска if else в php Facebook API / PHP – Можно ли изменить изображение профиля пользователя с помощью FB Graph API? Как загружать файлы на YouTube с помощью возобновляемого API загрузки v3 Альтернатива Captcha? Бинарное хранилище MySQL с использованием файловой системы BLOB VS OS: большие файлы, большие количества, большие проблемы

PHP Regex для определения относительного или абсолютного пути

Я использую 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;