Comment récupérer la chaine d'URL à la fin d'un message

  • Auteur de la discussion Auteur de la discussion Meeuuuhhh
  • Date de début Date de début
WRInaute passionné
Bonjour,

Voilà je sollicite votre aide pour un truc qui me dépasse quelque peu... J'ai un message et à la fin du message, il y a toujours un lien bbcode.

Dans ce genre :

Code:
le message de forum avec un lien bbcode [url=https://www.webrankinfo.com]Voir l'article[/url]

Ce que je veux, c'est récupérer l'url : -https://www.webrankinfo.com

Bien sûr, il peut y avoir d'autres liens dans le message, mais je ne veux que le dernier, qui se trouvera toujours en fin de message.

Voyez-vous comment faire s'il vous plait ?
 
WRInaute passionné
idéalement, et moins gourmand qu'un preg, utilise un explode.

Avec Explode :

Code:
$value = "le message de forum avec un lien bbcode [url=https://www.webrankinfo.com]Voir l'article[/url] et encore un dernier  [url=http://www.example.com]Voir l'article[/url]"

$exp_value_1 = explode('url=', $value);
$nb = count($exp_value_1) - 1];
$exp_value_2 = explode(']', $exp_value_1[$nb]);

$monBeauLien = $exp_value_2[0];

Avec preg_match_replace :

Code:
$value = "le message de forum avec un lien bbcode [url=https://www.webrankinfo.com]Voir l'article[/url] et encore un dernier  [url=http://www.example.com]Voir l'article[/url]"

preg_match_all('#\[url=([^]]+)\]#Us', $value, $match);

$nb_1 = count($match) -1;
$nb_2 = count($match[$nb_1]) - 1;

$monBeauLien = $match[$nb_1][$nb_2];

Si tu veux comprendre le résultat, je te met avec explode et preg :

Code:
$value = "le message de forum avec un lien bbcode [url=https://www.webrankinfo.com]Voir l'article[/url] et encore un dernier  [url=http://www.example.com]Voir l'article[/url]";

$exp_value_1 = explode('url=', $value);

echo '<pre>';
print_r($exp_value_1);
echo '</pre>';

$nb = count($exp_value_1) - 1;
$exp_value_2 = explode(']', $exp_value_1[$nb]);

echo '<pre>';
print_r($exp_value_2);
echo '</pre>';

$monBeauLien = $exp_value_2[0];

echo '<pre>';
print_r($monBeauLien);
echo '</pre>';

preg_match_all('#\[url=([^]]+)\]#Us', $value, $match);

echo '<pre>';
print_r($match);
echo '</pre>';

$nb_1 = count($match) -1;
$nb_2 = count($match[$nb_1]) - 1;
$monBeauLien = $match[$nb_1][$nb_2];

echo '<pre>';
print_r($monBeauLien);
echo '</pre>';

Tout en sachant que explode est beaucoup plus rapide que le preg.
En prime, je te met un bout de code pour comparer deux portions de script :wink:

Code:
$time_start = microtime(true);
$iteration = 100000;

//============================================================================
$value = "le message de forum avec un lien bbcode [url=https://www.webrankinfo.com]Voir l'article[/url] et encore un dernier  [url=http://www.example.com]Voir l'article[/url]";

//============================================================================
	
for($i=0; $i<$iteration; $i++) {	
//--------------------------------------------

$exp_value_1 = explode('url=', $value);
$nb = count($exp_value_1) - 1;
$exp_value_2 = explode(']', $exp_value_1[$nb]);
$monBeauLien = $exp_value_2[0];

//--------------------------------------------
}

$time_end = microtime(true);
$time = $time_end - $time_start;

echo '<p>le script N°1 a duré '.number_format($time, 3, ',', ' ').' secondes</p>';

$time_start = microtime(true);

for($i=0; $i<$iteration; $i++) {
//--------------------------------------------

preg_match_all('#\[url=([^]]+)\]#Us', $value, $match);

$nb_1 = count($match) -1;
$nb_2 = count($match[$nb_1]) - 1;
$monBeauLien = $match[$nb_1][$nb_2];
		
//--------------------------------------------
}
$time_end = microtime(true);
$time = $time_end - $time_start;

echo '<p>le script N°2 a duré '.number_format($time, 3, ',', ' ').' secondes</p>';

Pour 100 000 itérations, voici les résultat du test ci-dessus chez moi :

le script N°1 a duré 0,386 secondes

le script N°2 a duré 1,434 secondes
 
WRInaute passionné
Salut à vous,

Merci beaucoup pour ton code, medium69.

Ca à l'air de bien fonctionner.

J'ai fait comme ça, pour la bouche :
$affich=
"SELECT
post
FROM F_posts";
$resultat = mysql_query("$affich");
while($R = mysql_fetch_array($resultat))
{
$value=$R['post'];
$exp_value_1 = explode('url=', $value);
$nb = count($exp_value_1) - 1;
$exp_value_2 = explode(']', $exp_value_1[$nb]);
$monBeauLien = $exp_value_2[0];
echo"$monBeauLien<p>";
;}

A priori, je vois pas d'erreur à l'affichage. Par contre si tu voulais bien détailler un peu le code avec quelques lignes de commentaires, étape par étape, ça me permettrait de comprendre ce que je fais :oops:
 
WRInaute passionné
Je te commente ce que je t'ai donné alors, mais si tu veux vraiment comprendre, copie la version avec les balise <pre> dans une page de test. Tu verras ce que fait le code de visu :wink:

Code:
$affich=
"SELECT 
post
FROM F_posts";
$resultat = mysql_query("$affich");
while($R = mysql_fetch_array($resultat))
{
$value=$R['post']; // Le message dans lequel on veut récupérer la dernière url
$exp_value_1 = explode('url=', $value); // On explose le message à partir du début de chaque url (ex. http://url.com] du texte...)
$nb = count($exp_value_1) - 1; // on compte le nombre d'élément et on soustrait 1 (le tableau $exp_value_1 est indexé à partir de 0)
$exp_value_2 = explode(']', $exp_value_1[$nb]); // On explose le dernier élément du tableau précédant avec le caractère "]", élément suivant la fin de ton url dans ton cas
$monBeauLien = $exp_value_2[0]; // le tableau $exp_value_2 ne contient que deux éléments, on prend donc le premier index 0
echo"$monBeauLien<p>"; // Ton beau lien s'affiche ^^
;}
 
WRInaute passionné
Super ! Encore un grand merci à toi medium69 :) Je vais copier l'autre bout de code, pour voir la bête en action ;)
 
WRInaute passionné
Meeuuuhhh a dit:
Super ! Encore un grand merci à toi medium69 :) Je vais copier l'autre bout de code, pour voir la bête en action ;)

de "voir" ce que fait ton code est pas mal pour mieux le comprendre...
 
WRInaute impliqué
Le problème du système avec "explode", c'est que ce n'est pas fiable.

Que se passe t-il avec un message de ce genre :
L'emmerdeur a dit:
Pour créer un lien sur un texte, tu l'entour de balise URL et tu spécifies l'adresse avec url=. Par exemple : Voir l'article

Bien qu'on puisse dire que les expressions régulières soient plus gourmandes en ressource, franchement, gagner 1 seconde sur 100 000 requêtes, soit 10µs, ça n'en vaut pas la peine. Je préfère largement utiliser les expressions régulières qui de une sont plus fiable et de deux permettent beaucoup plus de chose.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut