Мне нужно регулярное выражение, которое даст мне строку внутри тега href и внутри кавычек.
Например, мне нужно извлечь theurltoget.com в следующем:
<a href="theurltoget.com">URL</a>
Кроме того, мне нужна только часть базового url. Т.е. из http://www.mydomain.com/page.html
я только хочу http://www.mydomain.com/
Не используйте для этого регулярное выражение. Вы можете использовать xpath и встроенные функции php, чтобы получить то, что вы хотите:
$xml = simplexml_load_string($myHtml); $list = $xml->xpath("//@href"); $preparedUrls = array(); foreach($list as $item) { $item = parse_url($item); $preparedUrls[] = $item['scheme'] . '://' . $item['host'] . '/'; } print_r($preparedUrls);
$html = '<a href="http://www.mydomain.com/page.html">URL</a>'; $url = preg_match('/<a href="(.+)">/', $html, $match); $info = parse_url($match[1]); echo $info['scheme'].'://'.$info['host']; // http://www.mydomain.com
это выражение будет обрабатывать 3 варианта:
'/ HREF = [ "\']? ([^ "\ ">] +) [" \ '] /?'
http://www.the-art-of-web.com/php/parse-links/
Начнем с простейшего случая – хорошо отформатированной ссылки без дополнительных атрибутов:
/<a href=\"([^\"]*)\">(.*)<\/a>/iU
Используйте ответ @Alec, если вы ищете только базовую часть url (вторая часть вопроса от @David)!
$html = '<a href="http://www.mydomain.com/page.html" class="myclass" rel="myrel">URL</a>'; $url = preg_match('/<a href="(.+)">/', $html, $match); $info = parse_url($match[1]);
Это даст вам:
$info Array ( [scheme] => http [host] => www.mydomain.com [path] => /page.html" class="myclass" rel="myrel )
Таким образом, вы можете использовать $href = $info["scheme"] . "://" . $info["host"]
$href = $info["scheme"] . "://" . $info["host"]
$href = $info["scheme"] . "://" . $info["host"]
Что дает вам:
// http://www.mydomain.com
Когда вы ищете весь URL-адрес между href, вы должны использовать другое регулярное выражение, например, регулярное выражение, предоставленное @ user2520237.
$html = '<a href="http://www.mydomain.com/page.html" class="myclass" rel="myrel">URL</a>'; $url = preg_match('/href=["\']?([^"\'>]+)["\']?/', $html, $match); $info = parse_url($match[1]);
это даст вам:
$info Array ( [scheme] => http [host] => www.mydomain.com [path] => /page.html )
Теперь вы можете использовать $href = $info["scheme"] . "://" . $info["host"] . $info["path"];
$href = $info["scheme"] . "://" . $info["host"] . $info["path"];
Что дает вам:
// http://www.mydomain.com/page.html
Для всех значений замены href:
function replaceHref($html, $replaceStr) { $match = array(); $url = preg_match_all('/<a [^>]*href="(.+)"/', $html, $match); if(count($match)) { for($j=0; $j<count($match); $j++) { $html = str_replace($match[1][$j], $replaceStr.urlencode($match[1][$j]), $html); } } return $html; } $replaceStr = "http://affilate.domain.com?cam=1&url="; $replaceHtml = replaceHref($html, $replaceStr); echo $replaceHtml;
Это будет обрабатывать случай, когда котировки вокруг URL-адреса отсутствуют.
/<a [^>]*href="?([^">]+)"?>/
Но серьезно, не разбирайте HTML с регулярным выражением . Используйте DOM или соответствующую библиотеку разбора.
/href="(https?://[^/]*)/
Думаю, вы сможете справиться с остальными.
Потому что положительный и отрицательный Lookbehind классные
/(?<=href=\").+(?=\")/
Он будет соответствовать только тому, что вы хотите, без кавычек
Массив ([0] => theurltoget.com)