Extraire les URL dans un texte sous PHP 5

[Résolu/Fermé]
Signaler
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013
-
Messages postés
5591
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2021
-
Bonjour;

je voudrais extraire des URL qui son contenus dans des fichier et les mettre dans un tableau mais je ne sais pas est ce que je peux faire ça avec php5;
quelqu'un à la moindre idée comment y procéder!!!!!!
Merci d'avance pour votre aide

5 réponses

Messages postés
816
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
24 novembre 2018
94
Salut salut,

Regarde de ce côté là :
    <?php
//déclaration d'un tableau
    $tableau = array();

//ouverture de ton fichier texte (tonfichier.txt) en lecture (r)
    $handle = @fopen("tonfichier.txt", "r" );

//Si le retour n'est pas false -> ouverture réussie
    if ($handle)
    {
//Tant que ce n'est pas la fin du fichier
       while (!feof($handle))
       {
//Récupération d'une ligne
         $buffer = fgets($handle, 4096);
//Insertion dans le tableau de la ligne récupérée
         $tableau[] = $buffer;
       }
//Fermeture du flux
       fclose($handle);
    }
    if ($tableau)
    {//affichage du tableau
       print_r($tableau);
    }
    else
    {//Message d'erreur si échec
       echo "Le remplissage du tableau a échoué";
    }
    ?>


Et vive PHP manual :
https://www.php.net/manual/fr/function.fopen.php
https://www.php.net/manual/fr/function.feof.php
https://www.php.net/manual/fr/function.fgets.php
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

Merci pour ta réponse mais ça je l'ai dejai fait ce que je voulais dire c'est que mon fichier contient des phrases et des URL et moi je veux que mon tableau ne contient que les URL et ignore les phrases
Messages postés
816
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
24 novembre 2018
94
Utilise preg_match ça fonctionne très bien
https://www.php.net/manual/fr/function.preg-match.php
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

est ce que je peux tester sur le début des phrases (je voudrais ignorer les phrases qui commencent par "!") et mettre le reste dans un tableau
Messages postés
816
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
24 novembre 2018
94
oui tu peux , par exemple :
Je ne suis pas sûr de la syntaxe, mais ça se trouve facilement :

if(!preg_match('^!' , $ligne)){
//Vrai si la ligne ne commence pas par "!"
}
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

il m'affiche le message suivant:
preg_match no ending dilimeter '!' found in /home/test.php on line 10
!!!
j'ai compris qu'il teste à la fin et moi je veux au début des phrases
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

j'ai inversé, j'ai fait if(!preg_match('/!^/' , $ligne)){ }
mais il n'a pas pris ça en considération, rien ne s'affiche!!
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

Bonjour ;
j'ai essayé avec cette méthode mais ça marche pas; j'ai fait:
for($i=0; $i<$nb;$i++){
$mot='/!^/'
if(!preg_match($mot, $tab[$i])){
array_push($te, $tav[$i]);
} }

print_r($t)
est ce que quelqu'un a une idée comment corriger ça!!!
merci d'avance.
Messages postés
816
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
24 novembre 2018
94
Essai comme ça :
if(!preg_match('/^!/','!hahaha')){
echo "ne commence pas par '!'";
}else{
echo "commence par '!'";
}

Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

merci pour ta réponse; mais quand je copie ton exemple il dit bien que "" commence par"" mais quand je modifie :
if(!preg_match('/!^/','!tab[$i]')){
print_r($tab);}

//car il y a bien des éléments dans mes sous tableaux qui ne commencent pas par"!"
je ne sais pourquoi!!!
Messages postés
816
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
24 novembre 2018
94
Tu peux faire un var_dump() de ton tableau et poster le resultat pour voir à quoi il ressemble?
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

excuse moi je ne peux pas te donner les données du tableau(c'est confidentiel); de toute façon avec ce que j'ai fait il affiche tout les élément de mon tableau à deux dimensions (les autres éléments contiennent "!" mais au milieu et moi je veux juste enlever ceux qui commencent avec "!")

Merci d'avance
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

je ne sais pas est ce que je peux faire ça avec des classes!!!
Messages postés
816
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
24 novembre 2018
94
Non mais tu peux faire un exemple , si ton tableau ressemble à ce que tu m'as dis , à savoir:
array("!blablabla",
"http://blop.blop",
"!blobloblo",
"http://arg.arg");

Le code que j'ai mi fonctionne

for($i=0;$i<count($tab);$i++){
if(!preg_match('/^!/',$tab[$i])){
echo $tab[$i]." : ne commence pas par '!'<br>";
}else{
echo $tab[$i]." : commence par '!'<br>";
}
}
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

je ne sais pas mais quand je fais ça:
for ($i=0; $i<$nb; $i++)
{

if(!preg_match('/^!/','$tab[$i]'))
{

array_push($te, $tab[$i]);

}
print_r($te);

}
je pense que c'est par rapport à mon tableau qui est un tableau à 2 dimension :

array(
[0]=>Array(
[0]=>!gsff hsztz gsfs
[1]=>jdgg ! hdg)
[1]=>Array(
[0]=>lkjd ! ioek ! jeuu mot phrase
[1]=>!pas pld ! pd
.
.
.)
.
.
.) c'est comme ça qu'il est mon tableau et comme ça qu'il s'affiche les élément sont des phrases.
Messages postés
816
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
24 novembre 2018
94
Ok donc il faut que tu doubles la boucle :

for($i=0;$i<count($tab);$i++){
for($j=0;$j<count($tab[$i]);$j++){
if(!preg_match('/^!/',$tab[$i][$j])){
...
}
}

Par contre je vois dans l'exemple que tu as mi que dans ton tableau certains éléments ne sont pas des url et ne commencent pas par "!" du coup ça ne fonctionnera pas...
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

c'est une phrase qui commence par des mots ensuite URL
! mon titre http:/jfdnjfjvnfvnnj
c'est comme ça mes éléments
Messages postés
5591
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2021
947
Salut abcd0,

Tu lis ton fichier avec file_get_contents pour mettre la totalité de son contenu dans une variable ((par exemple dans $contenu) :

https://www.php.net/manual/en/function.file-get-contents.php

Puis, tu utilises preg_match_all pour matcher toutes les URL contenues dans la variable $contenu, et les stocker dans un tableau (qu'on va nommer, par exemple, $urls), par rapport à une regex adéquate.

https://www.php.net/manual/fr/function.preg-match-all.php

Tu peux utiliser une regex, telle que :

preg_match_all('/https?:\/\/[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $contenu, $urls); 
print_r($urls);

Cette regex est inspirée de celle-ci : http://www.regexguru.com/2008/11/detecting-urls-in-a-block-of-text/ qui détecte des URL sur d'autres protocoles que http ou https et de cette réponse sur SO : https://stackoverflow.com/questions/2720805/php-regular-expression-to-get-a-url-from-a-string


Dal
Messages postés
5591
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2021
947
Pour moi, la regex est correcte, et ne matche pas "les autres phrases".

La preuve, sur un jeu de données inventé (tu n'as toujours pas donné un jeu de donnée reproduisant ton problème) :

<?php   

$tab = array(   
    array('toto', 'http://www.commentcamarche.net/forum/affich-27507684-extraire-les-url-dans-un-texte-sous-php-5'),   
    array('titi', 'et gros minet'),   
    array('http://php.net/manual/fr/function.preg-match-all.php', 'Expression rationnelle globale'),   
    array('pomme', 'poire'),   
    array('Scooby', 'Sammy'),   
    array('moteurs de recherche', 'Les adresses suivantes permettent d\'accéder à des moteurs de recherche bien connus https://www.google.fr/?gws_rd=ssl https://fr.yahoo.com/ http://www.bing.fr')  
);   

$nb = 6;   
$t_merged = array();   
$t_pushed = array();   

$n = 0;   

echo "<ul>";   
for ($i=0; $i<$nb; $i++)   
{   
    for ($j=0; $j<count($tab[$i]); $j++){   
        echo "<li> i = $i - j = $j</li>";   

        if (preg_match_all('/https?:\/\/[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $tab[$i][$j], $urls)){   
            echo "success";   
            $n=$n+1;   

            array_push($t_pushed, $urls[0]);   
            $t_merged = array_merge($t_merged, $urls[0]);   
        }   
    }   
}   
echo "</ul>";   
echo "<p>preg_match_all succeeded $n times</p>";   
echo "<p>and t_pushed is :<pre>";   
print_r($t_pushed);   
echo "</pre></p>";   
echo "<p>and t_merged is :<pre>";   
print_r($t_merged);   
echo "</pre></p>";   

?>

Ce qui donne :
    i = 0 - j = 0   
    i = 0 - j = 1   
    success   
    i = 1 - j = 0   
    i = 1 - j = 1   
    i = 2 - j = 0   
    success   
    i = 2 - j = 1   
    i = 3 - j = 0   
    i = 3 - j = 1   
    i = 4 - j = 0   
    i = 4 - j = 1   
    i = 5 - j = 0   
    i = 5 - j = 1   
    success   

preg_match_all succeeded 3 times   

and t_pushed is :   

Array   
(   
    [0] => Array   
        (   
            [0] => https://forums.commentcamarche.net/forum/affich-27507684-extraire-les-url-dans-un-texte-sous-php-5   
        )   

    [1] => Array   
        (   
            [0] => https://www.php.net/manual/fr/function.preg-match-all.php   
        )   

    [2] => Array   
        (   
            [0] => https://www.google.fr/?gws_rd=ssl   
            [1] => https://fr.yahoo.com/   
            [2] => https://www.bing.com/?cc=fr&toHttps=1&redig=F1EE93BEC54240039B83E0ADC111DFDA   
        )   

)   

and t_merged is :   

Array   
(   
    [0] => https://forums.commentcamarche.net/forum/affich-27507684-extraire-les-url-dans-un-texte-sous-php-5   
    [1] => https://www.php.net/manual/fr/function.preg-match-all.php   
    [2] => https://www.google.fr/?gws_rd=ssl   
    [3] => https://fr.yahoo.com/   
    [4] => https://www.bing.com/?cc=fr&toHttps=1&redig=F1EE93BEC54240039B83E0ADC111DFDA   
)

preg_match_all et l'expression proposée matche bien les URL. Ce qu'il te faut comprendre c'est comment elle fonctionne, ce qu'elle retourne, ce que tu veux en faire, et comment l'exploiter. C'est à toi de décider ce que tu veux faire des résultats.

Si tu fais array push, le tableau de résultats matchant l'unique expression et qui sera retourné par $urls[0] sera ajouté dans un tableau, tel quel. Si tu veux ajouter les résultats à la suite dans un simple tableau à une dimension, utilise array_merge.


Dal
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

il y a des lignes qui contiennent pas des URLs et mon code les prend en considération en laissant la case du tableau correspondante vide, comment négliger ces lignes pour que mon tab ne s'incrémente pas dans le vide
Messages postés
5591
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2021
947
Tu parles de "ton code". L'as-tu adapté après avoir testé le mien ?


Dal
Messages postés
56
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
10 juillet 2013

Merci, c'est bon , je suis arrivé à ignorer ces lignes :)
Messages postés
5591
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2021
947
ok, cool