rookie-doo
Goto Top

Wort in mehreren Dokumenten durch Textabschnitt ersetzen

Hallo,

ja, ich weiß, es gibt unzählige Lösungen, die ein Wort durch eine Textphrase ersetzen lassen können, keine Frage. Allerdings suche ich etwas für folgendes Problem:

Ich möchte in einer recht unmfangreichen Zahl von html-Dokumenten vor den <html>-Tag die Doctype-Deklarierung setzen lassen - mit zwei Zweilenumbrüchen Abstand dazwischen.
Das gleiche an den Dokumentenenden für die Einfügung von GoogleAnalytics-tags.

Also nicht nur eine Zeichenfolge durch eine Zeichenfolge ersetzen lassen, sondern eine Zeichenfolge durch eine Zeichenfolge mit einem bestimmten mehrzeiligen Format!

Kennt jemand eine Methode für dieses Problem?

Gruß und vielen Dank im Voraus
rkd

Content-ID: 89162

Url: https://administrator.de/contentid/89162

Ausgedruckt am: 17.12.2024 um 00:12 Uhr

bastla
bastla 04.06.2008 um 21:36:14 Uhr
Goto Top
Hallo Rookie-Doo!

Warum stellst Du nicht gleich konkret mit einer Gegenüberstellung "Vorher" - "Nachher" (der relevanten Teile) dar, welche Änderung Du durchführen möchtest?

Dann zeigt sich hoffentlich, ob es vielleicht schon genügen würde, jeweils einige Zeilen an Anfang und Ende der vorhandenen Dateien zu setzen ...

Grüße
bastla
Rookie-Doo
Rookie-Doo 04.06.2008 um 21:46:53 Uhr
Goto Top
Hallo bastla,

erstmal vielen Dank für die schnelle Antwort.

Weil ich hoffe, einen Universalmethode zu erfahren, damit ich ähnliche Probleme in Zukunft damit ebenfalls angehen kann. face-smile

Bezüglich des Doctypes-Tag trifft "Anfang der Datei" zu, allerdings schon nicht mehr bei dem GoogleAnalytics-Tag.

Gruß
rkd
bastla
bastla 04.06.2008 um 22:41:42 Uhr
Goto Top
Hallo Rookie-Doo!

Clevere Vorgangsweise - so kann ich das Testen des folgenden Vorschlages guten Gewissens Dir überlassen ... face-wink

'TagsErsetzen.vbs  
Pfad = "D:\Dein Ordner mit vielen html-Dateien"  
Typ = LCase("html")  

Von =  Array("<html>", _  
             "</Tag, nach welchem GoogleAnalytics-Tag eingefügt werden soll>")  
			
Nach = Array("<Dein DocType>" & vbCrLF & vbCrLF & vbCrLF & "<html>", _  
             "</Tag, nach welchem GoogleAnalytics-Tag eingefügt werden soll>" & "<GoogleAnalytics-Tag ...... />")  

Set fso=CreateObject("Scripting.FileSystemObject")  
For Each File In fso.GetFolder(Pfad).Files
    If LCase(fso.GetExtensionName(File.Path)) = Typ Then
        Text = fso.OpenTextFile(File.Path).ReadAll
        For i = 0 To UBound(Von)
            Text = Replace(Text, Von(i), Nach(i), 1, -1, 1)
        Next
        fso.OpenTextFile(File.Path, 2, True).Write Text
	End If
Next
Dieses VBScript ist mit dem Typ ".vbs" zu speichern und bearbeitet alle dem angegebenen Typ entsprechenden Dateien (im Beispiel: "*.html") des vorgegebenen Pfades. Die Ersetzung wird "in der Datei" vorgenommen (die neue Version überschreibt die alte Fassung), daher nur mit Kopien testen!

Starten kannst Du das Script aus dem Explorer per Doppelklick, da es keine Argumente erwartet.

Ersetzt wird jeweils der in "Von" angegebene Text durch dessen zeilenmäßige Entsprechung in "Nach" - dadurch ist die Anzahl variabel (was ja in Deinem Sinne sein sollte). Im Beispiel oben sind demnach 2 Paare von "Such-/Ersetzungstexten" angegeben.

Die Schreibweise dafür: Jeder Text steht unter Anführungszeichen und ist vom nächsten Text durch ein Komma getrennt. Übersichtlicher wird es, wenn zusätzlich ein Zeilenumbruch erfolgt - diesen erreichst Du über " _" am Ende der Zeile. Nach dem letzten Text endet die Zeile mit einer schließenden Klammer.

Sonderzeichen, wie der Zeilenumbruch "vbCrLF", können durch Verkettung per "&" an die konstanten Texte angefügt werden. Dies gilt auch für enthaltene Anführungszeichen, welche Du entweder durch Verdoppelung oder mit der Schreibweise Chr(34) angeben kannst - zB wäre für:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html>  
entweder
Nach = Array("<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN""" & vbCrLF & "     ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"">" & vbCrLF & vbCrLF & vbCrLF & "<html>"  
oder
Nach = Array("<!DOCTYPE html PUBLIC " & Chr(34) & "-//W3C//DTD XHTML 1.0 Strict//EN" & Chr(34) & vbCrLF & "     " & Chr(34) & "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" & Chr(34) &">" & vbCrLF & vbCrLF & vbCrLF & "<html>"  
zu schreiben.

Erst danach käme (bei Bedarf) als Trennung von der nächsten Zeile (um noch weitere Ersetzungstexte angeben zu können):
, _
oder die schließende Klammer.

Gesucht wird "case-insensitiv", ersetzt wird entsprechend dem eingegebenen Text - aus "<HTML>" würden durch die Ersetzung demnach 3 zusätzliche Zeilen vorneweg und "<html>".

Grüße
bastla
Rookie-Doo
Rookie-Doo 04.06.2008 um 23:20:41 Uhr
Goto Top
Boah, krass danke! face-smile

Teste ich gleich morgen. Ersetzt das Script auch die Dateien in den Unterverzeichnissen des angegebenen Pfades? Das wäre nämlich noch überaus schön. face-smile

Gruß, vielen dank und gn8! face-smile
Rookie-Doo
Rookie-Doo 07.06.2008 um 17:52:24 Uhr
Goto Top
Bastla? Ist es auch möglich den Text nicht nach, sondern vor einem Tag ersetzen zu lassen?

Bezüglich des Google-Tags würde ich nämlich diesen gerne vor dem </body>-Tag erscheinen lassen.
bastla
bastla 07.06.2008 um 18:01:23 Uhr
Goto Top
Hallo Rookie-Doo!

Ist es auch möglich den Text nicht nach, sondern vor einem Tag ersetzen zu lassen?
Es wird generell nicht vor oder nach, sondern einfach der gesamte Suchtext (egal ob Tag oder anderes) ersetzt - daher steht auch jeweils der in "Vor" angegebene zu ersetzende Text dann wieder in "Nach" (an der gewünschten Position).

Kurzfasssung: Ändere in "Nach" einfach für die zweite Zeile die Reihenfolge, sodass dort dann eben
...
             "<GoogleAnalytics-Tag ...... />" & "</body>")  
steht.

Grüße
bastla
Rookie-Doo
Rookie-Doo 07.06.2008 um 18:07:10 Uhr
Goto Top
Achja, logisch. Sry beim "Programmieren" merke ich einfach meine mathematisch-logischen Defizite. Hab's jetzt aber verstanden und bin schon eifrig am Testen, bekomme jedoch leder eine Syntaxfehlermeldung. Hat sicher irgendwas mit den Leerzeichen zu tun, gucke nochmal alles durch.
Rookie-Doo
Rookie-Doo 07.06.2008 um 18:23:28 Uhr
Goto Top
JUHUU, es funktioniert!! face-smile Vielen Dank!

Gibt allerdings noch ein Problem:

1. Wie kann ich das Sckript anweisen, auch die Unterverzeichnisse des angegebenen Verzeichnisses mit einzubeziehen?

2. Kann man das Skript anweisen, html- und htm-Dateien zu durchforsten?

3. Und da fällt mir jetzt spontan noch ein Problem ein: Ich habe bei Übernahme des betreffenden Websitenprojektes gemerkt, dass einige htm(l)-Dateien die Doctype-Deklaration enthalten. Ist es sehr kompliziert, das Skript bei diesen Dateien lediglich den Google-Tag setzen zu lassen?

Vielen Dank jedenfalls für die bisherige Hilfe, erspart mir etliche Stunden Arbeit! face-smile
bastla
bastla 07.06.2008 um 18:58:46 Uhr
Goto Top
Hallo Rookie-Doo!

Das sähe dann so aus:
'TagsErsetzen.vbs  
Pfad = "D:\Dein Ordner mit vielen html-Dateien"  
Typ = LCase("htm")  

Von =  Array("<html>", _  
    "</body>")  
			
Nach = Array("<Dein DocType>" & vbCrLF & vbCrLF & vbCrLF & "<html>", _  
    "<GoogleAnalytics-Tag ...... />" & "</body>")  

LenTyp = Len(Typ)
Set fso=CreateObject("Scripting.FileSystemObject")  
DoSubFolders fso.GetFolder(Pfad)
WScript.Echo "Fertig."  

Sub DoSubFolders(Folder)
For Each File In fso.GetFolder(Folder).Files
    If Left(LCase(fso.GetExtensionName(File.Path)), LenTyp) = Typ Then
        Text = fso.OpenTextFile(File.Path).ReadAll
        AbText = 0
        If InStr(1, Text, "<!DOCTYPE", vbTextCompare) Then AbText = 1  
        For i = AbText To UBound(Von)
            Text = Replace(Text, Von(i), Nach(i), 1, -1, 1)
        Next
        fso.OpenTextFile(File.Path, 2, True).Write Text
    End If
Next
For Each SubFolder In Folder.SubFolders
    DoSubFolders SubFolder
Next
End Sub
Wenn in der Datei der in Zeile 21 angegebene Suchbegriff "<!DOCTYPE" (Groß- / Kleinschreibung egal) vorkommt, wird die erste in "Von" festgelegte Ersetzung übersprungen.

Grüße
bastla
Rookie-Doo
Rookie-Doo 07.06.2008 um 21:56:00 Uhr
Goto Top
Hat alles wunderbar und erstklassig geklappt, vielen vielen Dank bastla! face-smile
BlubbBlubb17
BlubbBlubb17 05.07.2009 um 13:34:14 Uhr
Goto Top
Hallo,
dürfte ich das Tehma noch einmal aus der Versenkung holen?

Ich suche seit gestern auch nach einem script um alle html dokumente in einem Ordner gleich zu verändern und das oben beschriebene script scheint dafür ja ganz gut zu sein. (oder täusche ich mich? ich möchte bei allen dokumenten eine Tabelle mit einer anderen ersetzen)


Das Problem ist, dass das Script anscheinend doch eine ANweisung erwartet.
Ich erhalte immer den Fehler 800A04000.

Muss ich das Programm erst kompelieren, oder erst die entsprechenden vorher nachers Angaben im Quelltext angeben?

Grüße