it-swarm.com.de

Ordnen Sie den Pfad einer URL abzüglich der Dateinamenerweiterung zu

Was wäre der beste reguläre Ausdruck für dieses Szenario?

Mit dieser URL:

http://php.net/manual/en/function.preg-match.php

Wie soll ich vorgehen, um alles zwischen http://php.net Und .php Auszuwählen (aber nicht einzuschließen):

/manual/en/function.preg-match

Dies ist für eine Nginx Konfigurationsdatei.

11
silkAdmin

So was:

if (preg_match('/(?<=net).*(?=\.php)/', $subject, $regs)) {
    $result = $regs[0];
}

Erläuterung:

"
(?<=      # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind)
   net       # Match the characters “net” literally
)
.         # Match any single character that is not a line break character
   *         # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
(?=       # Assert that the regex below can be matched, starting at this position (positive lookahead)
   \.        # Match the character “.” literally
   php       # Match the characters “php” literally
)
"
8
FailedDev

Ein regulärer Ausdruck ist möglicherweise nicht das effektivste Werkzeug für diesen Job.

Versuchen Sie es mit parse_url() , kombiniert mit pathinfo() :

$url      = 'http://php.net/manual/en/function.preg-match.php';
$path     = parse_url($url, PHP_URL_PATH);
$pathinfo = pathinfo($path);

echo $pathinfo['dirname'], '/', $pathinfo['filename'];

Die obigen Code-Ausgaben:

/manual/en/function.preg-match
20
user212218

Versuche dies:

preg_match("/net(.*)\.php$/","http://php.net/manual/en/function.preg-match.php", $matches);
echo $matches[1];
// prints /manual/en/function.preg-match
3
morja

Es ist nicht erforderlich, einen regulären Ausdruck zu verwenden, um eine URL zu analysieren. PHP hat dafür eingebaute Funktionen, pathinfo () und parse_url () .

3
Crayon Violent

Nur zum Spaß gibt es zwei Möglichkeiten, die noch nicht untersucht wurden:

substr($url, strpos($s, '/', 8), -4)

Oder:

substr($s, strpos($s, '/', 8), -strlen($s) + strrpos($s, '.'))

Basierend auf der Idee, dass HTTP-Schemata http:// Und https:// Höchstens 8 Zeichen lang sind, reicht es normalerweise aus, den ersten Schrägstrich ab der 9. Position zu finden. Wenn die Erweiterung immer .php Ist, funktioniert der erste Code, andernfalls wird der andere benötigt.

Für eine reine Lösung mit regulären Ausdrücken können Sie die Zeichenfolge folgendermaßen aufteilen:

~^(?:[^:/?#]+:)?(?://[^/?#]*)?([^?#]*)~
                              ^

Der Pfadabschnitt würde sich innerhalb der ersten Speichergruppe (d. H. Index 1) befinden, angezeigt durch ^ In der Zeile unter dem Ausdruck. Die Erweiterung kann mit pathinfo() entfernt werden:

$parts = pathinfo($matches[1]);
echo $parts['dirname'] . '/' . $parts['filename'];

Sie können den Ausdruck auch wie folgt anpassen:

([^?#]*?)(?:\.[^?#]*)?(?:\?|$)

Dieser Ausdruck ist jedoch nicht sehr optimal, da er eine gewisse Rückverfolgung aufweist. Am Ende würde ich mich für etwas weniger Brauches entscheiden:

$parts = pathinfo(parse_url($url, PHP_URL_PATH));
echo $parts['dirname'] . '/' . $parts['filename'];
2
Ja͢ck

Einfach:

$url = "http://php.net/manual/en/function.preg-match.php";
preg_match("/http:\/\/php\.net(.+)\.php/", $url, $matches);
echo $matches[1];

$matches[0] ist Ihre vollständige URL, $matches[1] ist der Teil, den Sie wollen.

Überzeugen Sie sich selbst: http://codepad.viper-7.com/hHmwI2

0
user1626664

| (? <=\w) /.+ (? = \.\w + $) |

  • wähle alles aus dem ersten wörtlichen '/' vor
  • schauen Sie hinter ein Word-Zeichen (\ w)
  • bis ein Blick nach vorn folgt
    • wörtlich '.' angehängt von
    • ein oder mehrere Word-Zeichen (\ w)
    • vor dem Ende $
 re> | (? <=\w) /.+ (? = \.\w + $) | 
 Kompilierungszeit 0,0011 Millisekunden 
 Speicherzuweisung (Code-Speicherplatz): 32 
 Lernzeit 0,0002 Millisekunden 
 Erfassen der Submusteranzahl = 0 
 Keine Optionen 
 Erstes Zeichen = '/' 
 Benötigt kein Zeichen 
 Max lookbehind = 1 
 Subjektlänge untere Schranke = 2 
 Kein Satz Anfangsbytes 
 Daten> http://php.net/manual/en/function.preg-match. php 
 Ausführungszeit 0,0007 Millisekunden 
 0: /manual/en/function.preg-match

| // [^ /] * (. *) \.\w + $ |

  • finde zwei wörtliche '//' gefolgt von etwas anderem als einem wörtlichen '/'
  • alles auswählen bis
  • finde wörtlich '.' gefolgt von nur Word\w Zeichen vor dem Ende von $
 re> | // [^ /] * (. *) \.\w + $ | 
 Kompilierungszeit 0,0010 Millisekunden 
 Speicherzuweisung (Code-Speicherplatz): 28 
 Lernzeit 0,0002 Millisekunden 
 Anzahl der Teilmuster erfassen = 1 
 Keine Optionen 
 Erstes Zeichen = '/' 
 Erforderliches Zeichen = '.' Subjektlänge untere Schranke = 4 
 Kein Satz von Anfangsbytes 
 Daten> http://php.net/manual/en/function.preg-match.php[.____.₱Zeit ausführen 0,0005 Millisekunden 
 0: //php.net/manual/en/function.preg-match.php
 1: /manual/en/function.preg-match

|/[^ /] + (. *) \. |

  • finde wörtliches '/' gefolgt von mindestens einem nicht wörtlichen '/'
  • aggressiv wähle alles vor dem letzten wörtlichen '.'
 re> |/[^ /] + (. *) \. | 
 Kompilierungszeit 0,0008 Millisekunden 
 Speicherzuweisung (Code-Speicherplatz): 23 
 Lernzeit 0,0002 Millisekunden 
 Anzahl der Teilmuster erfassen = 1 
 Keine Optionen 
 Erstes Zeichen = '/' 
 Erforderliches Zeichen = '.' 
 Länge des Motivs Untergrenze = 3 
 Kein Satz von Startbytes 
 Daten> http://php.net/manual/en/function.preg-match.php[.____.‹Ausführungszeit 0,0005 Millisekunden 
 0: /php.net/manual/en/function.preg-match.
 1: /manual/en/function.preg-match

|/[^ /] +\K. * (? = \.) |

  • finde wörtliches '/' gefolgt von mindestens einem nicht wörtlichen '/'
  • Reset Select Start\K
  • aggressiv alles vorher auswählen
  • schau voraus letztes wörtliches '.'
 re> |/[^ /] +\K. * (? = \.) | 
 Kompilierungszeit 0,0009 Millisekunden 
 Speicherzuweisung (Code-Speicherplatz): 22 
 Lernzeit 0,0002 Millisekunden 
 Anzahl der Teilmuster erfassen = 0 
 Keine Optionen 
 Erstes Zeichen = '/' 
 Benötigt kein Zeichen 
 Länge des Motivs geringer bound = 2 
 Kein Satz von Startbytes 
 Daten> http://php.net/manual/en/function.preg-match.php[.____.‹Ausführungszeit 0,0005 Millisekunden 
 0: /manual/en/function.preg-match

|\w +\K/.* (? = \.) |

  • finde ein oder mehrere Word-Zeichen (\ w) vor einem wörtlichen '/'
  • reset Auswahl Start\K
  • wähle literal '/' gefolgt von
  • alles vor
  • schau voraus letztes wörtliches '.'
 re> |\w +\K/.* (? = \.) | 
 Kompilierungszeit 0,0009 Millisekunden 
 Speicherzuweisung (Code-Speicherplatz): 22 
 Study Zeit 0,0003 Millisekunden 
 Anzahl der Teilmuster erfassen = 0 
 Keine Optionen 
 Kein erstes Zeichen 
 Benötigt Zeichen = '/' maturiert.____ 
 Startbyte gesetzt: 0 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOP 
 QRSTUVWXYZ _ abcdefghijklmnopqrstu vwxyz 
 Data> http://php.net/manual/en/function. preg-match.php 
 Ausführungszeit 0.0011 Millisekunden 
 0: /manual/en/function.preg-match
0
nickl-

Mit dieser allgemeinen URL-Übereinstimmung können Sie Teile einer URL auswählen:

if (preg_match('/\\b(?P<protocol>https?|ftp):\/\/(?P<domain>[-A-Z0-9.]+)(?P<file>\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(?P<parameters>\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i', $subject, $regs)) {
    $result = $regs['file'];
    //or you can append the $regs['parameters'] too
} else {
    $result = "";
}
0
Homer6

Hier ist eine Regex-Lösung, die besser ist als die, die die meisten bisher bereitgestellt haben, wenn Sie mich fragen: http://regex101.com/r/nQ8rH5

/http: \/\/[^\/] +\K. * (? = \. [^.] + $)/i 
0
Firas Dib