Ich muss ein einzelnes Wort (bla) in den innersten Anführungszeichen finden. Beispiel:
<link rel="stylesheet" type="text/css" href="/BLAH/Test/Test/Test.css"> <script src="/blah/Test/Test/Test.js"></script>
Also brauche ich es, um zurückzukehren:
"/BLAH/Test/Test/Test.css"
"/blah/Test/Test/Test.js"
Wenn ich versuche, etwas zu schreiben, wird das erste und das letzte doppelte Zitat erfasst, anstatt zwei Instanzen des Wortes bla zu sehen.
Jede Hilfe wäre dankbar, aber mehr als das bitte erklären, damit ich lernen kann!
3 Antworten
Sie benötigen so etwas wie einen gierigen regulären Ausdruck, der in einem öffnenden Tag übereinstimmt, und werden dann zurückverfolgt, um so schnell wie möglich ein Vorkommen zu finden (Sie sollten das Flag i
für die Groß- / Kleinschreibung aktivieren oder [bB][lL][aA][hH]
verwenden):
<\w+ [^>]*\w+="([^"]*?blah[^"]*)"
Regex-Aufschlüsselung:
<\w+
Entspricht einer Tag-Öffnung[^>]*
Entspricht nichts außer>
, null oder mehrmals\w+="
Entspricht einem Attributnamen nach="
(
Start von CG # 1-
[^"]*?blah[^"]*
Ordne alles in doppelten Anführungszeichen zu, das das Wortblah
enthält
-
)
Ende von CG # 1"
Übereinstimmung"
Dann müssen Sie Zugriff auf die erste Erfassungsgruppe haben. In einer Sprache wie PHP wäre dies:
$str = <<<_
<link rel="stylesheet" type="text/css" href="/BLAH/Test/Test/Test.css">
<script src="/blah/Test/Test/Test.js"></script>
_;
preg_match_all('~<\w+ [^>]*\w+="([^"]*?blah[^"]*)"~i', $str, $matches);
var_dump($matches[1]); // Here we dump captured group one
(<link.*href=['"]([^'"]*).*|<script.*src=['"]([^'"]*).*)
Sie können es hier in Aktion sehen
Das heißt, es wird zuerst ein Link-Tag oder ein Skript-Tag gefunden. Dann sucht es in einem Link nach dem href-Attribut oder in einem Skript nach einem src-Attribut. Dann erfasst es alles, was in Anführungszeichen für dieses bestimmte Attribut steht. Dies funktioniert nicht , wenn Sie keine Anführungszeichen zum Definieren von Attributen verwenden.
Sie können auch meine Lookbehind-Methode verwenden, die ich in den Kommentaren vorgeschlagen habe, aber mir wurde gesagt, dass Lookbehinds werden nicht umfassend unterstützt, tun Sie dies also auf eigenes Risiko.
Wenn Sie "(.*)"
verwenden, um z. a="aa" b="bb"
, Sie würden aa" b="bb
erhalten, weil *
ein gieriger Operator ist - siehe z. Was bedeuten "faul" und "gierig" im Zusammenhang mit regulären Ausdrücken?
Sie können Lazy-Operatoren verwenden, z. *?
in "(.*?)"
oder ein gieriger Operator mit einem Ausdruck, der mit allem außer einem Anführungszeichen übereinstimmt, z. "([^"]*)"
Verwandte Fragen
Neue Fragen
regex
Reguläre Ausdrücke bieten eine deklarative Sprache, um Muster innerhalb von Zeichenfolgen abzugleichen. Sie werden häufig zur Validierung, Analyse und Transformation von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die jeweilige Programmiersprache oder das jeweilige Tool angibt.