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!

-1
jcaruso 23 Juni 2018 im 00:01

3 Antworten

Beste Antwort

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[^"]*)"

Live-Demo

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 Wort blah
    • 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
1
revo 22 Juni 2018 im 21:33

(<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.

1
emsimpson92 22 Juni 2018 im 21:46

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. "([^"]*)"

0
Aprillion 22 Juni 2018 im 21:32