Extracteur de liens A HREF dans une chaine

Extrait tous les liens d'une chaine. La chaine doit contenir un fichier HTML valide. Tous les liens et leurs attributs sont retournes dans un tableau. Auteur : Damien Seguy (Nexen)

Cette fonction utilise cette autre fonction Combine des tableaux en hash


Information sur les mises à jour

Dernière mise à jour :

17 Août 2019
fonctionnement du code vérifié
modification de la description

2 125  vues
Compatibilité du code
PHP 5, PHP 7 et PHP 8
  code classé dans   HTML
  code source classé dans   HTML
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
                    
<?php
/*------------------------------*/
/*
Titre : Extracteur de liens A HREF dans une chaine

Date édition : 14 Fev 2019
Date mise a jour : 17 Aout 2019

Rapport de la maj:
- fonctionnement du code vérifié
- modification de la description
*/
/*------------------------------*/

function arrays2hash($array_keys , $array_values){
if (!is_array($array_keys) || !is_array($array_values)){
return array();
}
if (count($array_keys) != count($array_values)){
return array();
}
$retour = array();
while(count($array_keys) > 0){
$retour[array_pop($array_keys)] = array_pop($array_values);
}
return $retour;
}

function link_extractor_string($chaine){
$retour = array();
while($x = strstr($chaine, "<a ")){
$href = substr($x, 3, strpos($x, ">") -3);
$chaine = substr($x, strpos($x, ">") +1);

preg_match_all("/\b([^\s]+)\s*=\s*(\"|\')(.*?)(\"|\')\s/", " $href ",
$attribut);
$details = arrays2hash($attribut[1], $attribut[3]);
$details['tag'] = $href;
$details['texte'] = substr($chaine, 0, strpos(strtolower($chaine), "</a>")
);
#print "\n";
$chaine = substr($chaine, strpos(strtolower($chaine), "</a>") +4);

$image2 = preg_replace("/\b([^\s]+)\s*=\s*(\"|\')([\s]*?)(\"|\')\s/", "",
" $href ");
preg_match_all("/\b([^\s]+)\s*=\s*([^\s]*?)\s/", " $image2 ", $attribut);

// l'ordre du merge est important : on ecrase les valeurs trouvees sans
// guillemets
// par celle trouvee avec.
$details = array_merge( arrays2hash($attribut[1], $attribut[2]), $details)
;
array_push($retour, $details);
}
return $retour;
}
?>
<?php
/*------------------------------*/
/*
Titre : Extracteur de liens A HREF dans une chaine

Date édition : 14 Fev 2019
Date mise a jour : 17 Aout 2019

Rapport de la maj:
- fonctionnement du code vérifié
- modification de la description
*/
/*------------------------------*/

function arrays2hash($array_keys , $array_values){
if (!is_array($array_keys) || !is_array($array_values)){
return array();
}
if (count($array_keys) != count($array_values)){
return array();
}
$retour = array();
while(count($array_keys) > 0){
$retour[array_pop($array_keys)] = array_pop($array_values);
}
return $retour;
}

function link_extractor_string($chaine){
$retour = array();
while($x = strstr($chaine, "<a ")){
$href = substr($x, 3, strpos($x, ">") -3);
$chaine = substr($x, strpos($x, ">") +1);

preg_match_all("/\b([^\s]+)\s*=\s*(\"|\')(.*?)(\"|\')\s/", " $href ",
$attribut);
$details = arrays2hash($attribut[1], $attribut[3]);
$details['tag'] = $href;
$details['texte'] = substr($chaine, 0, strpos(strtolower($chaine), "</a>")
);
#print "\n";
$chaine = substr($chaine, strpos(strtolower($chaine), "</a>") +4);

$image2 = preg_replace("/\b([^\s]+)\s*=\s*(\"|\')([\s]*?)(\"|\')\s/", "",
" $href ");
preg_match_all("/\b([^\s]+)\s*=\s*([^\s]*?)\s/", " $image2 ", $attribut);

// l'ordre du merge est important : on ecrase les valeurs trouvees sans
// guillemets
// par celle trouvee avec.
$details = array_merge( arrays2hash($attribut[1], $attribut[2]), $details)
;
array_push($retour, $details);
}
return $retour;
}
?>

Exemple :

 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
                    
<?php

$str =
'Est-ce que <a href="page1.php"></a> ca fonctionne <a href="page2.php"></a> ?';

$out = link_extractor_string($str);; ?>

<pre>
<?php print_r ( $out ) ?>
</pre>

Affiche :

Array
(
[0] => Array
(
[href] => page1.php
[tag] => href="page1.php"
[texte] =>
)

[1] => Array
(
[href] => page2.php
[tag] => href="page2.php"
[texte] =>
)

)
<?php

$str =
'Est-ce que <a href="page1.php"></a> ca fonctionne <a href="page2.php"></a> ?';

$out = link_extractor_string($str);; ?>

<pre>
<?php print_r ( $out ) ?>
</pre>

Affiche :

Array
(
[0] => Array
(
[href] => page1.php
[tag] => href="page1.php"
[texte] =>
)

[1] => Array
(
[href] => page2.php
[tag] => href="page2.php"
[texte] =>
)

)

      Fonctions du code - Doc officielle PHP

   php.net  
Description
Versions PHP
    array
Crée un tableau
PHP 4, 5, 7 et 8
    array_merge
Fusionne plusieurs tableaux en un seul
PHP 4, 5, 7 et 8
    array_pop
Dépile un élément de la fin d'un tableau
PHP 4, 5, 7 et 8
    array_push
Empile un ou plusieurs éléments à la fin d'un tableau
PHP 4, 5, 7 et 8
    count
Compte tous les éléments d'un tableau ou dans un objet Countable
PHP 4, 5, 7 et 8
    is_array
Détermine si une variable est un tableau
PHP 4, 5, 7 et 8
    preg_match_all
Expression rationnelle globale
PHP 4, 5, 7 et 8
    preg_replace
Rechercher et remplacer par expression rationnelle standard
PHP 4, 5, 7 et 8
    print_r
Affiche des informations lisibles pour une variable
PHP 4, 5, 7 et 8
    return
Retourne le controle du programme au module appelant
PHP 4, 5, 7 et 8
    strpos
Cherche la position de la première occurrence dans une chaîne
PHP 4, 5, 7 et 8
    strstr
Trouve la première occurrence dans une chaîne
PHP 4, 5, 7 et 8
    strtolower
Renvoie une chaîne en minuscules
PHP 4, 5, 7 et 8
    substr
Retourne un segment de chaîne
PHP 4, 5, 7 et 8
Minimum 10 mots. Votre commentaire sera visible après validation.


 Autres snippets qui pourraient vous intéresser

Trouve des liens dans un texte

Compatibilité : PHP 5, PHP 7, PHP 8

Propose une expression régulière qui devrait englober a peut prêt tous les types d'urls et les afficher dans un tableau.

PHP Liens et emails cliquables dans 1 texte

Compatibilité : PHP 5, PHP 7, PHP 8

Ce code permet de rendre les emails et les urls cliquables dans un texte, très pratique pour avoir des news ou autres textes à jour.

* Requêtes exécutées avec Recherche Contextuelle

  14 Fév 2019

Information sur les mises à jour

Dernière mise à jour :

17 Août 2019
fonctionnement du code vérifié
modification de la description

2 125 Vues
Compatibilité du code
PHP 5, PHP 7, PHP 8