Bonjour,
Bonjour,
Dge-06 a écrit :
J'ai beau chercher des tutos sur Internet, mais je crois vraiment que je n'y arriverai jamais avec ces regex
Personne n'y arrive avec les regex. Y en a certains qui pensent qu'ils y arrivent, mais en fait non, ils ont juste du bol !
Ceci étant, en supposant que l'on souhaite appliquer une regex sur la chaine de caractère <link rel='stylesheet' id='mon-id' href='https://www.monsite.com/dossier1/dossier2/
jeveuxca/blabla/blabla/css/style.css' type='text/css' media='all' /> pour y récupérer la partie en gras (ça dépend un peu des contraintes : est-ce que dossier1 et dossier2 par exemple sont variables ou pas), on peut essayer :
$s="<link rel='stylesheet' id='mon-id' href='https://www.monsite.com/dossier1/dossier2/jeveuxca/blabla/blabla/css/style.css' type='text/css' media='all' />";
if(preg_match("#^<link\s+rel='stylesheet'\s+id='mon-id'\s+href='https://www\.monsite\.com/dossier1/dossier2/([^/]+)/#",$s,$m))
print $m[1]."<br>";
else echo "plonk!";
Explications :
1) on utilise souvent / comme délimiteur (au début et à la fin) dans les regex. Mais comme dans la chaine de caractère qu'on veut tester, il y a aussi des / en pagaille, on va choisir un autre délimiteur (ici, j'ai pris #) pour éviter d'avoir des tartines de \ à rajouter.
2) j'ai commencé la regex par un ^ (juste après le premier #). Ceci n'a de sens que si c'est seulement la chaine que tu as donné en exemple qu'on teste. S'il s'agissait d'un texte plus long contenant la chaine en question, il ne faudrait pas mettre de ^.
3) dans la regex, on remplace les blancs par \s+ car on n'est jamais sûr qu'il y a exactement un espace, et jamais sûr que c'est bien un espace (code décimal ascii 32) et pas une autre sorte d'espace. En particulier, on notera que dans la chaine que tu as postée, il y a à un moment plusieurs "espaces" consécutifs. EDIT: en fait non, il n'y a pas d'espaces consécutifs, c'est moi qui en a rajouté un sans faire gaffe dans mon code de test. Mais bon, sur le principe, la précaution reste utile.
4) on utilise évidement des () pour capturer la chaine inconnue. Il suffit de les mettre à l'endroit où on attend la chaine inconnue.
5) cette chaine inconnue étant immédiatement suivi par un /, on utilise à l'intérieur des () [^/]+ qui signifie prendre tous les caractères (au moins un) qui ne sont pas des /.
6) je n'ai rien mis après les (), car j'ai supposé que ce n'était pas nécessaire. Mais peut-être que ça l'est. Il n'est pas difficile de rajouter les blabla s'il le fallait.
Amicalement,
Modifié par parsimonhi (29 Dec 2021 - 21:21)