Frage

Ich habe eine Reihe von html mit Zeilen wie diese:

<a href="#" rel="this is a test">

Ich brauche die Räume in dem rel-Attribute mit Unterstrichen zu ersetzen, aber ich bin eine Art von Regex-Noob!

Ich bin mit Textmate.

Kann mir jemand helfen?

/ Jakob

War es hilfreich?

Lösung

Ich glaube nicht, dass Sie dies richtig tun können. Obwohl ich frage mich, warum Sie es auf einmal tun müssen?

kann ich denke an eine wirklich schlechten Art und Weise tun, aber selbst wenn ich es nicht empfehlen, hier geht:

Sie könnten eine Art tun es mit der Regex unten. Allerdings würden Sie die Anzahl der Aufnahmen und Ausgänge mit einem _ am Ende auf die potenzielle Anzahl von Räumen in der rel erhöhen müssen. Ich wette, dass eine Anforderung, die diese Lösung nicht zulässt.

Suche:

{\<a *href\=\"[^\"]*" *rel\=\"}{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*

Ersetzen Sie:

\1\2_\3_\4_\5_\6_\7_\8_

Auf diese Weise hat zwei Nachteile, man ist auf die Anzahl der Aufnahmen Einschränkungen könnten Sie in Textmate haben können, zwei ist, dass Sie mit einer großen Anzahl von _ denen am Ende jeder Zeile am Ende werden.

Mit Ihrem aktuellen Test, mit dem regex oben, würden Sie am Ende mit:

<a href="#" rel="this_is_a_test">____

PS: Diese Regex von dem Format der Visual Studio-Suche ist / ersetzen Box. Sie werden wahrscheinlich einige Zeichen ändern müssen, um es fit textpad zu machen.

 {} => capturing group

  () => grouping

  [^A] => anything but A

  ( |\")* => space or "

  \1 => is the first capture 

Andere Tipps

Angenommen, Sie bereits den Wert rel erhalten:

var value = document.getElementById(id).getAttribute( "rel");
var rel = (new String( value)).replace( /\s/g,"_");
document.getElementById(id).setAttribute( "rel", rel);

Regexes sind grundsätzlich schlecht bei der HTML-Analyse (siehe Können Sie einige Beispiele dafür, warum es schwierig ist, XML und HTML mit einer Regex zu analysieren? , warum). Was Sie brauchen, ist ein HTML-Parser. Siehe Können Sie ein Beispiel für das Parsen HTML mit Ihrem Lieblings-Parser? Beispiele unter Verwendung einer Vielzahl von Parsern.

Ich habe an Bord bekommen den Zug hier „Sie das falsche Werkzeug für den Job verwenden“. Sie haben Textmate, so dass heißt, OSX, was bedeutet, Sie haben sed, awk, Rubin und Perl, dass all dies tun können, viel besser und einfacher.

Lernen, wie eines dieser Werkzeuge verwenden, um Text-Manipulation zu tun, werden Ihnen unzählige Vorteile in der Zukunft geben. Hier ist eine URL, die Sie in sed erleichtern wird: http://www.grymoire.com/Unix /Sed.html

Suchen: (rel="[^\s"]*)\s([^"]*")

Ersetzen: \1_\2

Dies ersetzt nur der erste Leerraum so klicken Sie auf „Alle ersetzen“, bis nichts mehr ersetzt. Es ist nicht schön, aber einfach zu verstehen und funktioniert mit jedem Editor.

Ändern rel in den Suchmustern, wenn Sie benötigen andere Attribute zu reinigen.

Wenn Sie Textmate verwenden, dann sind Sie auf einem Mac, und deshalb Python haben.

Versuchen Sie folgendes:

#!/usr/bin/env python

import re

input = open('test.html', 'r')

p_spaces = re.compile(r'^.*rel="[^"]+".*$')

for line in input:
    matches = p_spaces.findall(line)

    for match in matches:
        new_rel = match.replace(' ', '_')
        line = line.replace(match, new_rel)

    print line,

Beispiel für die Ausgabe:

 $ cat test.html
testing, testing, 1, 2, 3
<a href="#" rel="this is a test">
<unrelated line>
Stuff
<a href="#" rel="this is not a test">
<a href="#" rel="this is not a test" rel="this is invalid syntax (two rels)">
aoseuaoeua

 $ ./test.py
testing, testing, 1, 2, 3
<a_href="#"_rel="this_is_a_test">
<unrelated line>
Stuff
<a_href="#"_rel="this_is_not_a_test">
<a_href="#"_rel="this_is_not_a_test"_rel="this_is_invalid_syntax_(two_rels)">
aoseuaoeua
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top