2009-08-11 4 views
1

Je suis en train de mettre à jour un ensemble de pages Web vers un nouveau système, et je veux enlever et replacer le passe-partout en haut de chaque page et le remplacer par un nouveau passe-partout. Heureusement, chaque page a une table de contenu, et aucune table avant elle. Je veux faire quelque chose comme:Comment puis-je supprimer une table d'un document HTML?

$contents =~ s/^.*<table/$newHeader/ 

Cela ne fonctionne que pour la première ligne de $ contenu. Y a-t-il un moyen de tout remplacer avant (et y compris) la première table < dans le fichier avec mon nouveau passe-partout?

Répondre

7

Vous pouvez utiliser l'option « /s » de Perl qui lui indique que « . » correspond tous caractères dont (accord avec les nouvelles lignes de la chaîne comme une ligne géante unique au lieu de par ligne). Vous limitez le match à la première table en utilisant le ? quantificateurs pour rendre le * non gourmand: Aussi

$contents =~ s/^.*?<table/$newHeader/s 

, rappelez-vous juste que le remplacement dépouilleront le texte « <table » de sorte que vous devrez faire vous qu'il se réinséré en quelque sorte, peut-être avec:

$contents =~ s/^.*?<table/<table$newHeader/s 

Ou vous pouvez utiliser une affirmation positif look-ahead zéro largeur, qui dit « après le match, cette expression doit également correspondre », mais le texte l'assertion lookahead n'est pas considérée comme faisant partie du match (et ne sera donc pas remplacée) :

$contents =~ s/^.*?(?=<table)/$newHeader/s 

Et qui laissera la "<table" intacte.

+0

Parfait. Merci! –

+1

C'est une bonne réponse, mais ce n'est pas * parfait *. Il n'est tout simplement pas correct que l'option/s fasse correspondre un point à un espace. Un point correspond parfaitement aux espaces, même sans aucune option. Remplacer "espace blanc" par "nouvelle ligne" et la réponse est en effet parfaite. – innaM

+0

@Manni: Vous avez raison, corrigé. –

3

Le "." correspond normalement à n'importe quel caractère sauf un saut de ligne. Ajoutez "s" à votre expression rationnelle pour qu'elle corresponde à plusieurs lignes:

$contents =~ s/^.*?<table/$newHeader/s; 
Questions connexes