Shlex ist eine in C geschriebene PHP-Erweiterung. Diese Erweiterung implementiert die Funktionalität der Shlex-Bibliothek in Python. Um Benutzer mit der Shlex-Erweiterung vertrauter zu machen, ist die von der Erweiterung implementierte Klasse hinsichtlich der Eigenschafts- und Methodennamen im Wesentlichen mit der Python-Shlex-Bibliothek identisch. Die Schnittstellendokumentation wurde ebenfalls gegenüber der Schnittstellendokumentation der Python-Shlex-Bibliothek geändert.
Mit Shlex ist es einfach, lexikalische Analysatoren für einfache Syntaxen zu schreiben, die denen der Unix-Shell ähneln. Dies ist oft nützlich, um Minisprachen zu schreiben oder Strings in Anführungszeichen zu analysieren.
phpize
./configure
make && make install
Das Windows-System wird derzeit nicht unterstützt.
Teilen Sie die Zeichenfolge s mithilfe einer Shell-ähnlichen Syntax auf.
array shlex_split( string|resource|null $s [, bool $comments = false [, bool $posix = true ]] )
Teilen Sie die Zeichenfolge s mithilfe einer Shell-ähnlichen Syntax auf.
Note:
Since the shlex_split() function instantiates a shlex instance, passing null for s will read the string to split from standard input.
Wenn comments den Wert false hat (Standardeinstellung), wird das Parsen von Kommentaren in der angegebenen Zeichenfolge deaktiviert (durch Setzen des Attributs commenters der Shlex-Instanz auf die leere Zeichenfolge).
Diese Funktion arbeitet standardmäßig im POSIX-Modus, verwendet jedoch den Nicht-POSIX-Modus, wenn das Posix-Argument falsch ist.
Gibt ein Array geteilter Zeichenfolgen zurück.
<?php
$s = "foo#bar";
$ret = shlex_split($s, true);
var_dump($ret);
?>
Das obige Beispiel gibt Folgendes aus:
array(1) {
[0] =>
string(3) "foo"
}
Gibt eine Shell-Escape-Version der Zeichenfolge s zurück.
string shlex_quote( string $s )
Die Zeichenfolge, die maskiert werden soll.
Der zurückgegebene Wert ist eine Zeichenfolge, die sicher als ein Token in einer Shell-Befehlszeile verwendet werden kann, für Fälle, in denen Sie keine Liste verwenden können.
<?php
// If the output is executed, it will cause the index.php file to be deleted.
$filename = "somefile; rm -rf index.php";
$command = sprintf("ls -l %s", $filename);
echo $command;
echo "n";
// shlex_quote() blocked the vulnerability
$command = sprintf("ls -l %s", shlex_quote($filename));
echo $command;
echo "n";
// remote connection
$remoteCommand = sprintf("ssh home %s", shlex_quote($command));
echo $remoteCommand;
echo "n";
?>
Das obige Beispiel gibt Folgendes aus:
ls -l somefile; rm -rf index.php
ls -l 'somefile; rm -rf index.php'
ssh home 'ls -l '"'"'somefile; rm -rf index.php'"'"''
Eine Shlex-Instanz oder Unterklasseninstanz ist ein lexikalisches Analyseobjekt.
Shlex implements Iterator {
/* Properties */
public resource|null $instream = null;
public string|null $infile = null;
private bool|null $posix = null;
public string|null $eof = null;
public string $commenters = '#';
public string $wordchars = 'abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_';
public string $whitespace = " trn";
public bool $whitespaceSplit = false;
public string $quotes = ''"';
public string $escape = '\';
public string $escapedquotes = '"';
private string $state = ' ';
private array $pushback = [];
public int $lineno = 1;
public int $debug = 0;
public string $token = '';
private array $filestack = [];
public string|null $source = null;
public string|null $punctuationChars = null;
private array|null $_punctuationChars = null;
/* Methods */
public void function __construct( [ string|resource|null $instream = null [, string|null $infile = null [, bool $posix = false [, string|bool|null $punctuationChars = false ]]]]);
public void function __destruct( void );
public void function key( void );
public void function next( void );
public void function rewind( void );
public string|null function current( void );
public bool function valid( void );
public void function pushToken( string $tok );
public void function pushSource( string|resource $newstream, string|null $newfile = null );
public void function popSource( void );
public string|null|ShlexException function getToken( void );
public string|null|ShlexException function readToken( void );
public array function sourcehook( string $newfile );
public string function errorLeader( string $infile = null, int|null $lineno = null );
}
Der Eingabestream, aus dem diese Shlex-Instanz Zeichen liest.
Der Name der aktuellen Eingabedatei, wie er ursprünglich zum Zeitpunkt der Klasseninstanziierung festgelegt oder durch spätere Quellanforderungen gestapelt wird. Es kann hilfreich sein, dies beim Erstellen von Fehlermeldungen zu untersuchen.
Token, der zur Bestimmung des Dateiendes verwendet wird. Dies wird im Nicht-POSIX-Modus auf die leere Zeichenfolge ('') und im POSIX-Modus auf null gesetzt.
Die Zeichenfolge, die als Kommentaranfänger erkannt wird. Alle Zeichen vom Kommentaranfang bis zum Zeilenende werden ignoriert. Enthält standardmäßig nur „#“.
Die Zeichenfolge, die zu Token mit mehreren Zeichen zusammengefasst wird. Beinhaltet standardmäßig alle alphanumerischen ASCII-Zeichen und Unterstriche. Im POSIX-Modus sind auch die Akzentzeichen im Satz Latin-1 enthalten. Wenn punctuationChars nicht leer ist, werden die Zeichen ~-./*?=, die in Dateinamenspezifikationen und Befehlszeilenparametern vorkommen können, ebenfalls in dieses Attribut aufgenommen, und alle Zeichen, die in punctuationChars erscheinen, werden aus Wordchars entfernt, falls sie vorhanden sind dort vorhanden.
Zeichen, die als Leerzeichen betrachtet und übersprungen werden. Leerzeichen begrenzen Token. Beinhaltet standardmäßig Leerzeichen, Tabulatorzeichen, Zeilenvorschub und Wagenrücklauf.
Wenn „true“, werden Token nur in Leerzeichen aufgeteilt. Dies ist beispielsweise nützlich, um Befehlszeilen mit Shlex zu analysieren und Token auf ähnliche Weise wie Shell-Argumente abzurufen. Wenn dieses Attribut wahr ist, haben punctuationChars keine Auswirkung und die Aufteilung erfolgt nur bei Leerzeichen. Bei der Verwendung von punctuationChars, das eine Analyse ermöglichen soll, die der von Shells implementierten ähnelt, empfiehlt es sich, „whitespaceSplit“ auf „false“ (Standardwert) zu belassen.
Zeichen, die als Anführungszeichen betrachtet werden. Das Token sammelt sich an, bis das gleiche Anführungszeichen erneut auftritt (daher schützen sich verschiedene Anführungszeichentypen gegenseitig wie in der Shell). Standardmäßig sind einfache und doppelte ASCII-Anführungszeichen enthalten.
Zeichen, die als Escape betrachtet werden. Dies wird nur im POSIX-Modus verwendet und enthält standardmäßig nur ''.
Zeichen in Anführungszeichen, die in Escape definierte Escape-Zeichen interpretieren. Dies wird nur im POSIX-Modus verwendet und enthält standardmäßig nur „““.
Quellzeilennummer (Anzahl der bisher gesehenen Zeilenumbrüche plus eins).
Wenn dieses Attribut numerisch ist und 1 oder mehr beträgt, gibt eine Shlex-Instanz eine ausführliche Fortschrittsausgabe zu ihrem Verhalten aus. Wenn Sie dies verwenden müssen, können Sie den Quellcode des Moduls lesen, um die Details zu erfahren.
Der Token-Puffer. Es kann nützlich sein, dies beim Abfangen von Ausnahmen zu untersuchen.
Dieses Attribut ist standardmäßig null. Wenn Sie ihm eine Zeichenfolge zuweisen, wird diese Zeichenfolge in verschiedenen Shells als Einschlussanforderung auf lexikalischer Ebene ähnlich dem Quellschlüsselwort erkannt. Das heißt, das unmittelbar folgende Token wird als Dateiname geöffnet und die Eingabe wird von diesem Stream bis zum EOF übernommen. Zu diesem Zeitpunkt wird die fclose()-Methode dieses Streams aufgerufen und die Eingabequelle wird wieder zum ursprünglichen Eingabestream. Quellanfragen können beliebig viele Ebenen tief gestapelt werden.
Zeichen, die als Satzzeichen gelten. Satzzeichenfolgen werden als einzelnes Token zurückgegeben. Beachten Sie jedoch, dass keine semantische Gültigkeitsprüfung durchgeführt wird: Beispielsweise könnte „>>>“ als Token zurückgegeben werden, auch wenn es von Shells möglicherweise nicht als solches erkannt wird.
Konstrukteur
public void function Shlex::__construct( [ string|resource|null $instream = null [, string|null $infile = null [, bool $posix = false [, string|bool|null $punctuationChars = false ]]]])
Das Instream-Argument gibt, falls vorhanden, an, woher Zeichen gelesen werden sollen. Es muss eine Ressourcentypvariable (kann von fread( ) gelesen werden) oder eine Zeichenfolge sein. Wenn kein Argument angegeben wird, wird die Eingabe von php://stdin übernommen.
Das zweite optionale Argument ist eine Dateinamenzeichenfolge, die den Anfangswert des Infile-Attributs festlegt. Wenn das Instream-Argument null ist, ist dieses Infile-Argument immer null.
Das Posix-Argument definiert den Betriebsmodus: Wenn Posix falsch ist (Standard), wird die Shlex-Instanz im Kompatibilitätsmodus betrieben. Beim Betrieb im POSIX-Modus versucht Shlex, den POSIX-Shell-Parsing-Regeln so nahe wie möglich zu kommen.
Das Argument punctuationChars bietet eine Möglichkeit, das Verhalten noch näher an die Analyse echter Shells anzupassen. Dies kann mehrere Werte annehmen: den Standardwert false. Wenn auf „true“ gesetzt, wird das Parsen der Zeichen ();<>|& geändert: Jede Folge dieser Zeichen (als Satzzeichen betrachtet) wird als einzelnes Token zurückgegeben. Wenn es sich um eine nicht leere Zeichenfolge handelt, werden diese Zeichen als Satzzeichen verwendet. Alle Zeichen im Wordchars-Attribut, die in punctuationChars vorkommen, werden aus Wordchars entfernt.
Es wird kein Wert zurückgegeben.
<?php
$instance = new Shlex("a && b || c", null, false, "|");
$list = [];
foreach ($instance as $value) {
$list[] = $value;
}
var_dump($list);
?>
Das obige Beispiel gibt Folgendes aus:
array(6) {
[0] =>
string(1) "a"
[1] =>
string(1) "&"
[2] =>
string(1) "&"
[3] =>
string(1) "b"
[4] =>
string(2) "||"
[5] =>
string(1) "c"
}
Zerstörer
public void function Shlex::__destruct( void )
Wird verwendet, um von Shlex-Objekten gehaltene Ressourcenobjekte freizugeben. Intern wird fclose( ) aufgerufen, um das Dateihandle zu schließen.
Keine Parameter.
Es wird kein Wert zurückgegeben.
Keine Beispiele.
Für die Schlüsselmethode der Iterator-Schnittstelle gibt es keinen praktischen Nutzen.
public void function Shlex::key( void )
Keine Parameter.
Es wird kein Wert zurückgegeben.
Keine Beispiele.
Für die nächste Methode der Iterator-Schnittstelle gibt es keinen praktischen Nutzen.
public void function Shlex::next( void )
Keine Parameter.
Es wird kein Wert zurückgegeben.
Keine Beispiele.
Für die Rückspulmethode der Iterator-Schnittstelle gibt es keinen praktischen Nutzen.
public void function Shlex::rewind( void )
Keine Parameter.
Es wird kein Wert zurückgegeben.
Keine Beispiele.
Gibt den von Shlex in dieser Iteration gelesenen Tokenwert zurück.
public string|null function Shlex::current( void )
Keine Parameter.
Gibt den von Shlex in dieser Iteration gelesenen Tokenwert zurück.
Keine Beispiele.
Bestimmen Sie, ob diese Iteration gültig ist.
public bool function Shlex::valid( void )
Keine Parameter.
Gültig, wenn true zurückgegeben wird, false ist ungültig.
Note:
Due to the implementation of this class, iteratively reading the next element is also called inside the method. So the next() method is invalid.
Keine Beispiele.
Schieben Sie das Argument auf den Token-Stapel.
public void function Shlex::pushToken( string $tok )
Der Parameter, der gepusht wird.
Es wird kein Wert zurückgegeben.
Keine Beispiele.
Schieben Sie einen Eingabequellstrom auf den Eingabestapel.
public void function Shlex::pushSource( string|resource $newstream, string|null $newfile = null );
Der Eingabequellstrom, der gepusht wird.
Wenn das Dateinamenargument angegeben wird, steht es später zur Verwendung in Fehlermeldungen zur Verfügung. Dies ist dieselbe Methode, die intern von der Methode sourcehook() verwendet wird.
Es wird kein Wert zurückgegeben.
Keine Beispiele.
Entfernen Sie die zuletzt übertragene Eingabequelle aus dem Eingabestapel. Dies ist dieselbe Methode, die intern verwendet wird, wenn der Lexer EOF in einem gestapelten Eingabestream erreicht.
public void function Shlex::popSource( void )
Keine Parameter.
Es wird kein Wert zurückgegeben.
Keine Beispiele.
Geben Sie einen Token zurück.
public string|null|ShlexException function Shlex::getToken( void )
Keine Parameter.
Wenn Token mit pushToken() gestapelt wurden, entfernen Sie einen Token vom Stapel. Andernfalls lesen Sie einen aus dem Eingabestream. Wenn beim Lesen ein sofortiges Dateiende auftritt, wird eof zurückgegeben (die leere Zeichenfolge ('') im Nicht-POSIX-Modus und null im POSIX-Modus).
Keine Beispiele.
Lesen Sie einen Rohtoken.
public string|null|ShlexException function Shlex::readToken( void )
Lesen Sie einen Rohtoken. Ignorieren Sie den Pushback-Stack und interpretieren Sie keine Quellanforderungen. (Dies ist normalerweise kein nützlicher Einstiegspunkt und wird hier nur der Vollständigkeit halber dokumentiert.)
Keine Parameter.
Gibt ein Roh-Token zurück.
Keine Beispiele.
public array function Shlex::sourcehook( string $newfile )
Wenn Shlex eine Quellanforderung erkennt (siehe Quelle unten), erhält diese Methode das folgende Token als Argument und soll ein Array aus einem Dateinamen und einem geöffneten dateiähnlichen Objekt zurückgeben.
Normalerweise entfernt diese Methode zunächst alle Anführungszeichen aus dem Argument. Wenn das Ergebnis ein absoluter Pfadname ist, keine vorherige Quellanforderung aktiv war oder die vorherige Quelle ein Stream war (z. B. php://stdin), bleibt das Ergebnis unberücksichtigt. Wenn das Ergebnis andernfalls ein relativer Pfadname ist, wird der Verzeichnisteil des Namens der Datei unmittelbar davor im Quelleinschlussstapel vorangestellt (dieses Verhalten ähnelt der Art und Weise, wie der C-Präprozessor #include „file.h“ verarbeitet).
Das Ergebnis der Manipulationen wird als Dateiname behandelt und als erste Komponente des Tupels zurückgegeben, wobei fopen() darauf aufgerufen wird, um die zweite Komponente zu erhalten. (Hinweis: Dies ist die umgekehrte Reihenfolge der Argumente bei der Instanzinitialisierung!)
Dieser Hook wird offengelegt, sodass Sie ihn verwenden können, um Verzeichnissuchpfade, das Hinzufügen von Dateierweiterungen und andere Namespace-Hacks zu implementieren. Es gibt keinen entsprechenden „close“-Hook, aber eine Shlex-Instanz ruft die fclose()-Methode des Quelleingabestreams auf, wenn sie EOF zurückgibt.
Für eine explizitere Steuerung des Quellstapels verwenden Sie die Methoden pushSource() und popSource().
Dateipfad.
Gibt ein Array aus einem Dateinamen und einem geöffneten dateiähnlichen Objekt zurück.
Keine Beispiele.
Gibt einen Fehlermeldungsanfang im Format einer Unix-C-Compiler-Fehlerbezeichnung zurück.
public string function Shlex::errorLeader( string $infile = null, int|null $lineno = null )
Diese Methode generiert einen Fehlermeldungsanfang im Format einer Unix-C-Compiler-Fehlerbezeichnung; Das Format ist „%s“, Zeile %d: „, wobei %s durch den Namen der aktuellen Quelldatei und %d durch die aktuelle Eingabezeilennummer ersetzt wird (die optionalen Argumente können verwendet werden, um diese zu überschreiben). .
Dieser Komfort wird bereitgestellt, um Shlex-Benutzer zu ermutigen, Fehlermeldungen im standardmäßigen, analysierbaren Format zu generieren, das von Emacs und anderen Unix-Tools verstanden wird.
Der Name der aktuellen Quelldatei.
Die aktuelle Eingabezeilennummer.
Gibt einen Fehlermeldungsanfang im Format einer Unix-C-Compiler-Fehlerbezeichnung zurück.
Keine Beispiele.
Die Ausnahmeklasse von Shlex
Diese Klasse wird hauptsächlich für Ausnahmen verwendet, die ausgelöst werden, wenn die Shlex-Klasse intern einen Fehler ausführt.
ShlexException extends Exception {}
<?php
throw new ShlexException('No escaped character');
?>