web-dev-qa-db-fra.com

regex php pour obtenir une chaîne dans la balise href

J'ai besoin d'un regex qui me donnera la chaîne à l'intérieur d'une balise href et à l'intérieur des guillemets également.

Par exemple, je dois extraire theurltoget.com de la manière suivante:

<a href="theurltoget.com">URL</a>

De plus, je ne veux que la partie base de l'URL. C'est à dire. à partir de http://www.mydomain.com/page.html je veux seulement http://www.mydomain.com/

10
David

Ne pas utiliser regex pour cela. Vous pouvez utiliser xpath et des fonctions php intégrées pour obtenir ce que vous voulez:

    $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);
17
Drew Hunter
$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
11
Alec

cette expression gérera 3 options:

  1. pas de citations
  2. double citation
  3. guillemets simples

'/ href = ["\']? ([^"\'>] +) ["\']?/'

7
ishubin

http://www.the-art-of-web.com/php/parse-links/

Commençons par le cas le plus simple - un lien bien formaté sans attributs supplémentaires:

/<a href=\"([^\"]*)\">(.*)<\/a>/iU
5
drudge

Utilisez la réponse de @Alec si vous ne recherchez que la partie base de l'URL (la deuxième partie de la question posée par @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]);

Cela vous donnera:

$info
Array
(
    [scheme] => http
    [Host] => www.mydomain.com
    [path] => /page.html" class="myclass" rel="myrel
)

Vous pouvez donc utiliser $href = $info["scheme"] . "://" . $info["Host"] Ce qui vous donne:

// http://www.mydomain.com  

Lorsque vous recherchez l’URL complète entre les lettres href, vous devez utiliser une autre expression rationnelle, par exemple celle fournie par @ 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]);

cela vous donnera:

$info
Array
(
    [scheme] => http
    [Host] => www.mydomain.com
    [path] => /page.html
)

Vous pouvez maintenant utiliser $href = $info["scheme"] . "://" . $info["Host"] . $info["path"]; Qui vous donne:

// http://www.mydomain.com/page.html
5
Linkmichiel

Pour toutes les valeurs de remplacement 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;
4
Basani

Cela traitera le cas où il n'y a pas de guillemets autour de l'URL.

/<a [^>]*href="?([^">]+)"?>/

Mais sérieusement, ne pas analyser HTML avec regex . Utilisez DOM ou une bibliothèque d'analyse appropriée. 

1
kijin
/href="(https?://[^/]*)/

Je pense que vous devriez être capable de gérer le reste.

0
Adam Byrtek

Parce que les positifs et négatifs sont cool

/(?<=href=\").+(?=\")/

Il ne correspondra qu'à ce que vous voulez, sans guillemets

Tableau ( [0] => theurltoget.com)

0