Discussion:
recherche/selection de patterns/portions de lignes
(trop ancien pour répondre)
Jean-Francois Ortolo
2007-03-20 22:29:17 UTC
Permalink
Bonjour

Pour une assoc, je suis bénévole.

Je suis en train de modifier un site dont les urls comportent des
espaces ( entre autre ), donc j'ai fait deux script PHP, le premier a
modifié les noms des sous-répertoires et des fichiers ( espace -->
souligné et autre babioles de lettres accentuées ), le second est
destiné à lire tous les fichiers *.htm ( pages HTML ) d'un répertoire,
en sélectionnant les ligne comportant des balises comportant des urls (
telles que <form, <img, ou <a href= ), le problème étant, sachant
l'attribut de la balise correspondante, précédant l'url à modifier, à
extraire cette url exactement, ainsi que le contenu qui précède, et le
contenu qui suit ( ces deux contenus doivent rester inchangés ).

Ensuite je modifie l'url à ad hoc, y compris pour la rendre relative
( faut encore voir comment ), puis je recompose la ligne complète
modifiée , à écrire dans un fichier temporaire.

Evidemment, les lignes ne comportant pas ces balises, sont réécrites
telles quelles dans le fichier temporaire.

Après chaque lecture/écriture de chaque page HTML/fichier temporaire,
je renomme le fichiee temporaire dans le nom de la page HTML, qui est
ainsi traduite ad hoc, pour que son contenu soit compatible avec les
noms modifiés des fichiers.

Je reconnais qu'il faudrait pour bien faire, vérifier au fur et à
mesure que les pages HTML sont parsées comme ça, que les fichiers déjà
renommés, existent bien sur l'arborescence de fichiers, sinon je
risquerais de traduire bêtement une url externe au site. ( On ne sait
jamais ).

Donc, voilà mon problème: Etant donné une ligne dans un variable, et
un pattern donné, comment extraire le contenu qui suit le pattern dans
la ligne, ( le contenu est théoriquement entre quotes " " mais... :( ),
puis extraire ce qui précède le contenu dans la ligne, ce qui le suit,
de façon à être en mesure de recomposer la ligne entière, après
modification du contenu ?

Je suppose qu'il existe des fonctions de traitement de variables
chaînes, en PHP, qui répondent à mes besoins, mais lesquelles ?

Merci beaucoup de vos réponses.

Jean-François Ortolo


PS Evidemment, le procédé de traduction est le même, pour le premier
script et le second script, ceci pour assurer la compatibilité entre les
noms des fichiers, et les urls contenues dans les fichiers.
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Olivier Miakinen
2007-03-20 23:10:52 UTC
Permalink
Post by Jean-Francois Ortolo
Je suis en train de modifier un site dont les urls comportent des
espaces ( entre autre ), donc j'ai fait deux script PHP, le premier a
modifié les noms des sous-répertoires et des fichiers ( espace -->
souligné et autre babioles de lettres accentuées ),
Pour te faciliter la tâche, tu peux faire le changement en trois étapes
au lieu d'une seule.

1re étape : au lieu de renommer les fichiers, tu les recopies sous leur
nouveau nom (ou mieux, tu fais un lien entre l'ancien nom et le nouveau,
par ln ou ln -s si tu es sur Unix ou Linux).

2e étape : tu changes les liens dans les fichiers HTML.

3e étape : tu supprimes vraiment les fichiers avec les anciens noms.

En principe, le site devrait continuer à fonctionner à tout moment
durant l'ensemble du processus.
Post by Jean-Francois Ortolo
Je reconnais qu'il faudrait pour bien faire, vérifier au fur et à
mesure que les pages HTML sont parsées comme ça, que les fichiers déjà
renommés, existent bien sur l'arborescence de fichiers, sinon je
risquerais de traduire bêtement une url externe au site. ( On ne sait
jamais ).
Il est très facile de reconnaître une url externe. C'est une url absolue
et non pas relative (commençant donc par http:// ou https://) dont le
nom de machine n'est pas celui de ton site.

Note que dans mon scénario à trois étapes tu peux encore scinder la
deuxième étape en deux, l'une pour les URL relatives, l'autre pour les
URL absolues pointant sur le même site.
Post by Jean-Francois Ortolo
Donc, voilà mon problème: Etant donné une ligne dans un variable, et
un pattern donné, comment extraire le contenu qui suit le pattern dans
la ligne, ( le contenu est théoriquement entre quotes " " mais... :( ),
puis extraire ce qui précède le contenu dans la ligne, ce qui le suit,
de façon à être en mesure de recomposer la ligne entière, après
modification du contenu ?
Note que si le contenu d'un attribut n'est pas entre guillemets (simples
' ' ou doubles " ") et que la page passe le validateur, alors ce fichier
n'a pas besoin de changer de nom puisqu'il ne contient aucune espace ni
lettre accentuée. Tous ses caractères seront dans [a-zA-Z0-9_:,-].

http://www.la-grange.net/w3c/html4.01/intro/sgmltut.html#h-3.2.2
Post by Jean-Francois Ortolo
Je suppose qu'il existe des fonctions de traitement de variables
chaînes, en PHP, qui répondent à mes besoins, mais lesquelles ?
Déjà il y a ça : <http://fr3.php.net/pcre>. Tu dois avoir aussi des
fonctions qui parsent une page HTML pour en faire un arbre DOM, puis le
réécrire après manipulation, mais je ne connais pas bien ces fonctions.
D'autres te renseigneront probablement mieux que moi.
Jean-Francois Ortolo
2007-03-21 11:29:49 UTC
Permalink
Bonjour Monsieur

Voir mes réponses ci-dessous.

Merci beaucoup.

Jean-François Ortolo
Post by Olivier Miakinen
Pour te faciliter la tâche, tu peux faire le changement en trois étapes
au lieu d'une seule.
1re étape : au lieu de renommer les fichiers, tu les recopies sous leur
nouveau nom (ou mieux, tu fais un lien entre l'ancien nom et le nouveau,
par ln ou ln -s si tu es sur Unix ou Linux).
2e étape : tu changes les liens dans les fichiers HTML.
3e étape : tu supprimes vraiment les fichiers avec les anciens noms.
En principe, le site devrait continuer à fonctionner à tout moment
durant l'ensemble du processus.
C'est ce que j'avais l'intention de faire...

Il faut bien que je garde trace des anciens fichiers, ne serait-ce
qu'au moment de la mise au point.
Post by Olivier Miakinen
Il est très facile de reconnaître une url externe. C'est une url absolue
et non pas relative (commençant donc par http:// ou https://) dont le
nom de machine n'est pas celui de ton site.
Note que dans mon scénario à trois étapes tu peux encore scinder la
deuxième étape en deux, l'une pour les URL relatives, l'autre pour les
URL absolues pointant sur le même site.
Effectivement, je peux, dans le cas où une url est absolue et pointe
sur le même site, comparer le préfixe http://mapage.noos.fr/$login/
avec le préfixe http:// de l'url, si ce n'est pas le même, c'est qu'il y
a soit faute d'orthographe ( et lien mort ), soir l'url est externe.
Post by Olivier Miakinen
Post by Jean-Francois Ortolo
Donc, voilà mon problème: Etant donné une ligne dans un variable, et
un pattern donné, comment extraire le contenu qui suit le pattern dans
la ligne, ( le contenu est théoriquement entre quotes " " mais... :( ),
puis extraire ce qui précède le contenu dans la ligne, ce qui le suit,
de façon à être en mesure de recomposer la ligne entière, après
modification du contenu ?
Note que si le contenu d'un attribut n'est pas entre guillemets (simples
' ' ou doubles " ") et que la page passe le validateur, alors ce fichier
n'a pas besoin de changer de nom puisqu'il ne contient aucune espace ni
lettre accentuée. Tous ses caractères seront dans [a-zA-Z0-9_:,-].
Ben... Vous copmprenez, de toute façon ces pages HTML ne passent pas
le validateur de toute façon, elle ont été faites avec Dreamweaver,
alors pour la justesse de la syntaxe... De toute façon, il y a tellement
de pages HTML dans le site, que ce serait trop long de passer chacune
des pages au validateur. C'est la raison pour laquelle je fais un
traitement automatique ( et rapide ).
Post by Olivier Miakinen
Déjà il y a ça : <http://fr3.php.net/pcre>. Tu dois avoir aussi des
fonctions qui parsent une page HTML pour en faire un arbre DOM, puis le
réécrire après manipulation, mais je ne connais pas bien ces fonctions.
D'autres te renseigneront probablement mieux que moi.
Bon, je pense que les expressions pcre sont au dessus de ma
compréhension.

Je pense que je vais m'en tenir au classique traitement par explode
sur motifs ( $tmp = split("[hH][rR][eE][fF][ ]*=", $line); ) , et puis
traiter aussi le cas où l'array résultante contient plus de deux
éléments ( plusieurs href= sur la même ligne ).

Merci beaucoup de vos réponses, pour commencer je vais simplement
voir si les fichiers HTML sont codés en utf-8 ou en ascii.

Bien à vous.

Amicalement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Jean-Francois Ortolo
2007-03-22 11:33:39 UTC
Permalink
Bonjour Monsieur

Bon, c'est quasiment fait, il ne me reste plus que d'avoir la table
d'équivalence caractères web %[A-Z0-9]{2] et caractères ascii. Mon Nvu
ne me donne pas certains caractères comme %E9 qui est l'équivalent de é,
à la place il me donne: %C3%A9

Et puis... J'ai programmé un script PHP de détection des liens morts,
avec un log dans un fichier, donnant le nom de la page HTML, et du lien
fautif s'y trouvant.

Et puis... J'ai programmé un script PHP détectant les liens relatifs
à des fichiers spécifiques de dreamweaver, que malheureusement le
webmaster a laissé parmi les liens. ( Il contiennent le token "DW" ).

Et puis.. Je peux mettre tous les suffixes en minuscules automatiquement.

Pour le programme initial, je ne me suis pas cassé la tête: Compte
tenu du fait que je devais détecter tous les noms de fichiers quelles
que soient leurs situations dans chaque pages HTML, j'ai simplement
utilisé comme patterns de reconnaissance, les suffixes suivis d'une
apostrophe ou d'une quote: "[\.][Hh][Tt][Mm]\"" par exemple pour les
pages *.htm suivies d'une apostrophe.

Pour extraire les portions de chaîne, j'utilise la sempiternelle
méthode: explode($motif, $chaine) , je met de côté le dernier élément de
l'array résultante, puis je traite chacun des autres éléments de l'array.

Toutes les pages HTML sont de la forme *.htm , et non pas *.html , ce
qui permet la compatibilité avec les serveurs Windows, il me semble que
tous les hébergeurs Unix/Linux, acceptent ce type de pages HTML.

Cà baigne.

Bien à vous.

Amicalement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Olivier Miakinen
2007-03-22 13:32:43 UTC
Permalink
Post by Jean-Francois Ortolo
Bon, c'est quasiment fait, il ne me reste plus que d'avoir la table
d'équivalence caractères web %[A-Z0-9]{2] et caractères ascii.
Noter que les caractères ascii sont restreints à %[2-7][0-9A-F].
Post by Jean-Francois Ortolo
Mon Nvu
ne me donne pas certains caractères comme %E9 qui est l'équivalent de é,
à la place il me donne: %C3%A9
Ahem... Ce n'est donc pas ascii, mais cp1252, ou iso-8859-1, ou encore
iso-8859-15. L'encodage d'un é dans ces trois tables se fait par l'envoi
d'un octet valant E9 en hexa, tandis qu'en UTF-8 ce sera avec les deux
octets C3 et A9. Bien évidemment, le « é » n'existe pas dans la table ASCII.

<cit. http://www.miakinen.net/vrac/charsets/doc>
Mais toutes les fois où vous entendrez nommer « ASCII » ou « L'ASCII
étendu » (avec article défini) un jeu de caractères 8 bits, vous pouvez
être sûrs que ce terme est impropre, et désigne probablement CP1252,
CP850 ou CP437.
</cit.>
Jean-Francois Ortolo
2007-03-22 18:50:33 UTC
Permalink
Post by Olivier Miakinen
Ahem... Ce n'est donc pas ascii, mais cp1252, ou iso-8859-1, ou encore
iso-8859-15. L'encodage d'un é dans ces trois tables se fait par l'envoi
d'un octet valant E9 en hexa, tandis qu'en UTF-8 ce sera avec les deux
octets C3 et A9. Bien évidemment, le « é » n'existe pas dans la table ASCII.
Bonjour Monsieur

Il semblerait effectivement, que ces pages html, toutes faites avec
Dreamweaver, soient en iso-8859-1.

Après décarcassage et passage au programme détecteur de liens morts
de ma composition, j'obtiens, pour 112 pages html dans le répertoire
racine, 46 liens morts, dont 21 sont des liens pointant vers des
fichiers spécifiques à Dreamweaver.

Le webmaster aura le listing de ses liens morts, à lui de jouer.

J'ai très très peu de pages html dans trois sous-répertoires, et ai
corrigé un lien mort dans une page. Aucun autre lien mort dans ces
sous-répertoires.

Dans le répertoire racine, j'ai pu réparer deux liens morts.

Il y avait seulement un ou deux liens externes, détectés facilement
par egrep.

Content de moi... ;)

Et hop.

Bien à vous.

Amicalement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Olivier Miakinen
2007-03-22 11:33:39 UTC
Permalink
Post by Jean-Francois Ortolo
Bon, je pense que les expressions pcre sont au dessus de ma
compréhension.
Dans l'immense majorité des cas où on utilise des expressions POSIX, il
n'est pas beaucoup plus compliqué d'utiliser les expressions PCRE à la
place.
Post by Jean-Francois Ortolo
Je pense que je vais m'en tenir au classique traitement par explode
sur motifs ( $tmp = split("[hH][rR][eE][fF][ ]*=", $line); )
split("[hH][rR][eE][fF][ ]*=", $line);
est équivalent à :
preg_split("/[hH][rR][eE][fF][ ]*=/", $line);
voire à :
preg_split("/href *=/i", $line);
Post by Jean-Francois Ortolo
Merci beaucoup de vos réponses, pour commencer je vais simplement
voir si les fichiers HTML sont codés en utf-8 ou en ascii.
Il y a d'autres cas que utf-8 et ascii. Il me semble même que le cas le
plus fréquent serait iso-8859-1, voire cp1252 faussement annoncé comme
iso-8859-1.
thierry
2007-03-22 13:32:43 UTC
Permalink
bonjour,

j'arrive tard on dirait mais comme je me suis décarcassé :)
Post by Jean-Francois Ortolo
Donc, voilà mon problème: Etant donné une ligne dans un variable, et
un pattern donné, comment extraire le contenu qui suit le pattern dans
la ligne, ( le contenu est théoriquement entre quotes " " mais... :( ),
puis extraire ce qui précède le contenu dans la ligne, ce qui le suit,
de façon à être en mesure de recomposer la ligne entière, après
modification du contenu ?
voici ma solution:
//************************************************************************
$line = "<form method= \"action.php\"><a href ='toto.fr'><img
src='image.jpg'/></a></form>";
$newLine = "";
preg_match_all("/(href|src|method) *= *(['\"].*['\"])/Ui", $line, $res);
$replace = array();
if ( isset($res[2]) && count($res[2]) > 0) {
foreach ($res[2] as $str ) {
//ici traitement de $str
$replace[] = strtoupper($str);
}
//et on met à jour la ligne
$newLine = str_replace($res[2], $replace, $line);
}
echo $line."\r\n";
echo $newLine;

//************************************************************************

si si, ça marche :)
Continuer la lecture sur narkive:
Loading...