8768 sujets

Développement web côté serveur, CMS

Bonjour tout le monde.

J'aurai besoin d'une âme charitable pour me dépatouiller avec un regex php.

J'ai beau chercher des tutos sur Internet, mais je crois vraiment que je n'y arriverai jamais avec ces regex Smiley ohwell

Je souhaiterai récupérer ce qui est en gras ci dessous. Attention, ce qui est en gras est susceptible de changer de nom, ce sont des variables.

<link rel='stylesheet' id='mon-id' href='https://www.monsite.com/dossier1/dossier2/jeveuxca/blabla/blabla/css/style.css' type='text/css' media='all' />


Merci merci Smiley smile
Modérateur
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 ! Smiley lol Smiley lol Smiley lol

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)
Hello @parsimonhi, merci pour ton aide et tes explications.

J'y vois (un peu) plus clair Smiley smile

Par contre, j'ai essayé, mais ça ne fonctionne pas.

À savoir que l'URL peut changer et le id='mon-id' est susceptible de changer lui aussi.

J'ai donc essayé ça, mais ça ne fonctionne pas non plus Smiley decu


if(preg_match("#^<link\s+rel='stylesheet'\s+id='([^/]+)'\s+href='https://www\.monsite\.com/dossier1/dossier2/([^/]+)/#",$s,$m))

Modifié par Dge-06 (30 Dec 2021 - 10:58)
Modérateur
Bonjour,

1) l'id est délimité par des '. Il vaut mieux donc utiliser id='([^']+)' que id='([^/]+)'. Avec ce que tu as mis, ça peut marcher, mais c'est du bol ! (voir ma première réponse pour des précisions sur la notion "avoir du bol" quand on s'amuse avec des regex Smiley lol ).

2) si tu n'as pas besoin de récupérer sa valeur, il n'est pas nécessaire de mettre des parenthèses. Si tu mets ces (), alors le tableau m contiendra à l'indice 1 la valeur de l'id et non pas le nom du dossier que tu cherches. Avec la regex que tu as utilisée, la valeur du dossier "jeveuxca" sera dans m[2].

3) après, tu me dis que ton url peut changer. Certes ! Mais c'est quoi les parties variables ? Et surtout, est-ce que c'est toujours le 3e sous-dossier (dans l'url) que tu cherches ?

4) et enfin, tu me dis que ça ne marche pas. C'est quoi le symptôme qui te fait dire que ça ne marche pas (si ça se trouve, l'erreur est ailleurs) ?

Amicalement,
Modifié par parsimonhi (31 Dec 2021 - 00:11)