Shlex adalah ekstensi PHP yang ditulis dalam C. Ekstensi ini mengimplementasikan fungsionalitas perpustakaan shlex dengan Python. Untuk membuat pengguna lebih mengenal ekstensi Shlex, kelas yang diimplementasikan oleh ekstensi tersebut pada dasarnya sama dengan pustaka python shlex dalam hal nama properti dan metode. Dokumentasi antarmuka juga dimodifikasi dari dokumentasi antarmuka perpustakaan python shlex.
Shlex memudahkan penulisan penganalisis leksikal untuk sintaksis sederhana yang mirip dengan shell Unix. Ini sering kali berguna untuk menulis bahasa mini atau untuk mengurai string yang dikutip.
phpize
./configure
make && make install
Sistem Windows saat ini tidak didukung.
Pisahkan string menggunakan sintaks mirip shell.
array shlex_split( string|resource|null $s [, bool $comments = false [, bool $posix = true ]] )
Pisahkan string menggunakan sintaks mirip shell.
Note:
Since the shlex_split() function instantiates a shlex instance, passing null for s will read the string to split from standard input.
Jika komentar salah (default), penguraian komentar dalam string yang diberikan akan dinonaktifkan (mengatur atribut pemberi komentar dari instance shlex ke string kosong).
Fungsi ini beroperasi dalam mode POSIX secara default, tetapi menggunakan mode non-POSIX jika argumen posix salah.
Mengembalikan array string terpisah.
<?php
$s = "foo#bar";
$ret = shlex_split($s, true);
var_dump($ret);
?>
Contoh di atas akan menampilkan:
array(1) {
[0] =>
string(3) "foo"
}
Mengembalikan versi string s yang lolos dari shell.
string shlex_quote( string $s )
String yang akan di-escape.
Nilai yang dikembalikan adalah string yang dapat digunakan dengan aman sebagai satu token di baris perintah shell, untuk kasus di mana Anda tidak dapat menggunakan daftar.
<?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";
?>
Contoh di atas akan menampilkan:
ls -l somefile; rm -rf index.php
ls -l 'somefile; rm -rf index.php'
ssh home 'ls -l '"'"'somefile; rm -rf index.php'"'"''
Instance Shlex atau instance subkelas adalah objek penganalisis leksikal.
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 );
}
Aliran input dari mana instance Shlex ini membaca karakter.
Nama file input saat ini, yang awalnya ditetapkan pada waktu pembuatan instance kelas atau ditumpuk oleh permintaan sumber selanjutnya. Mungkin berguna untuk memeriksa hal ini ketika membuat pesan kesalahan.
Token digunakan untuk menentukan akhir file. Ini akan disetel ke string kosong (''), dalam mode non-POSIX, dan ke null dalam mode POSIX.
Rangkaian karakter yang dikenali sebagai komentar pemula. Semua karakter dari komentar awal hingga akhir baris diabaikan. Hanya menyertakan '#' secara default.
Rangkaian karakter yang akan terakumulasi menjadi token multi-karakter. Secara default, mencakup semua alfanumerik ASCII dan garis bawah. Dalam mode POSIX, karakter beraksen dalam set Latin-1 juga disertakan. Jika punctuationChars tidak kosong, karakter ~-./*?=, yang dapat muncul dalam spesifikasi nama file dan parameter baris perintah, juga akan disertakan dalam atribut ini, dan karakter apa pun yang muncul dalam punctuationChars akan dihapus dari wordchars jika karakter tersebut kosong. hadir di sana.
Karakter yang akan dianggap spasi dan dilewati. Token batas spasi. Secara default, mencakup spasi, tab, umpan baris, dan pengangkutan kembali.
Jika benar, token hanya akan dibagi dalam spasi. Ini berguna, misalnya, untuk mengurai baris perintah dengan Shlex, mendapatkan token dengan cara yang mirip dengan argumen shell. Jika atribut ini benar, punctuationChars tidak akan berpengaruh, dan pemisahan hanya akan terjadi pada spasi putih. Saat menggunakan punctuationChars, yang dimaksudkan untuk memberikan penguraian yang mendekati apa yang diterapkan oleh shell, disarankan untuk membiarkan whitespaceSplit sebagai false (nilai default).
Karakter yang akan dianggap sebagai kutipan string. Token terakumulasi hingga kutipan yang sama ditemukan lagi (dengan demikian, jenis kutipan yang berbeda saling melindungi seperti di shell.) Secara default, menyertakan tanda kutip tunggal dan ganda ASCII.
Karakter yang akan dianggap sebagai pelarian. Ini hanya akan digunakan dalam mode POSIX, dan hanya menyertakan '' secara default.
Karakter dalam tanda kutip yang akan menafsirkan karakter escape yang didefinisikan dalam escape. Ini hanya digunakan dalam mode POSIX, dan hanya menyertakan '"' secara default.
Nomor baris sumber (jumlah baris baru yang terlihat sejauh ini ditambah satu).
Jika atribut ini numerik dan 1 atau lebih, instance Shlex akan mencetak keluaran kemajuan verbose pada perilakunya. Jika Anda perlu menggunakan ini, Anda dapat membaca kode sumber modul untuk mempelajari detailnya.
Penyangga token. Mungkin berguna untuk memeriksa hal ini ketika menangkap pengecualian.
Atribut ini adalah null secara default. Jika Anda menetapkan string ke dalamnya, string tersebut akan dikenali sebagai permintaan penyertaan tingkat leksikal yang mirip dengan kata kunci sumber di berbagai shell. Artinya, token berikutnya akan segera dibuka sebagai nama file dan masukan akan diambil dari aliran tersebut hingga EOF, yang pada saat itu metode fclose() dari aliran tersebut akan dipanggil dan sumber masukan akan kembali menjadi aliran masukan asli. Permintaan sumber dapat ditumpuk pada kedalaman berapa pun.
Karakter yang akan dianggap tanda baca. Rangkaian karakter tanda baca akan dikembalikan sebagai token tunggal. Namun, perhatikan bahwa tidak ada pemeriksaan validitas semantik yang akan dilakukan: misalnya, '>>>' dapat dikembalikan sebagai token, meskipun mungkin tidak dikenali oleh shell.
Konstruktor
public void function Shlex::__construct( [ string|resource|null $instream = null [, string|null $infile = null [, bool $posix = false [, string|bool|null $punctuationChars = false ]]]])
Argumen instream, jika ada, menentukan dari mana karakter akan dibaca. Itu harus berupa variabel tipe sumber daya (dapat dibaca oleh fread()), atau string. Jika tidak ada argumen yang diberikan, input akan diambil dari php://stdin.
Argumen opsional kedua adalah string nama file, yang menetapkan nilai awal atribut infile. Jika argumen instream adalah null, maka argumen infile ini selalu null.
Argumen posix mendefinisikan mode operasional: ketika posix salah (default), instance Shlex akan beroperasi dalam mode kompatibilitas. Saat beroperasi dalam mode POSIX, Shlex akan berusaha sedekat mungkin dengan aturan parsing shell POSIX.
Argumen punctuationChars menyediakan cara untuk membuat perilaku tersebut semakin mendekati cara penguraian shell sebenarnya. Ini dapat mengambil sejumlah nilai: nilai default, salah. Jika disetel ke true, maka penguraian karakter ();<>|& diubah: setiap rangkaian karakter ini (dianggap sebagai karakter tanda baca) dikembalikan sebagai token tunggal. Jika diatur ke rangkaian karakter yang tidak kosong, karakter tersebut akan digunakan sebagai karakter tanda baca. Karakter apa pun di atribut wordchars yang muncul di punctuationChars akan dihapus dari wordchars.
Tidak ada nilai yang dikembalikan.
<?php
$instance = new Shlex("a && b || c", null, false, "|");
$list = [];
foreach ($instance as $value) {
$list[] = $value;
}
var_dump($list);
?>
Contoh di atas akan menampilkan:
array(6) {
[0] =>
string(1) "a"
[1] =>
string(1) "&"
[2] =>
string(1) "&"
[3] =>
string(1) "b"
[4] =>
string(2) "||"
[5] =>
string(1) "c"
}
Penghancur
public void function Shlex::__destruct( void )
Digunakan untuk melepaskan objek sumber daya yang dipegang oleh objek Shlex. Secara internal, fclose() dipanggil untuk menutup pegangan file.
Tidak ada parameter.
Tidak ada nilai yang dikembalikan.
Tidak ada contoh.
Tidak ada kegunaan praktis untuk metode kunci antarmuka Iterator.
public void function Shlex::key( void )
Tidak ada parameter.
Tidak ada nilai yang dikembalikan.
Tidak ada contoh.
Tidak ada kegunaan praktis untuk metode antarmuka Iterator selanjutnya.
public void function Shlex::next( void )
Tidak ada parameter.
Tidak ada nilai yang dikembalikan.
Tidak ada contoh.
Tidak ada kegunaan praktis untuk metode rewind pada antarmuka Iterator.
public void function Shlex::rewind( void )
Tidak ada parameter.
Tidak ada nilai yang dikembalikan.
Tidak ada contoh.
Mengembalikan nilai token yang dibaca oleh Shlex pada iterasi ini.
public string|null function Shlex::current( void )
Tidak ada parameter.
Mengembalikan nilai token yang dibaca oleh Shlex pada iterasi ini.
Tidak ada contoh.
Tentukan apakah iterasi ini valid.
public bool function Shlex::valid( void )
Tidak ada parameter.
Valid jika benar dikembalikan, salah tidak valid.
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.
Tidak ada contoh.
Dorong argumen ke tumpukan token.
public void function Shlex::pushToken( string $tok )
Parameter sedang didorong.
Tidak ada nilai yang dikembalikan.
Tidak ada contoh.
Dorong aliran sumber masukan ke tumpukan masukan.
public void function Shlex::pushSource( string|resource $newstream, string|null $newfile = null );
Aliran sumber masukan sedang didorong.
Jika argumen nama file ditentukan, maka argumen tersebut nantinya akan tersedia untuk digunakan dalam pesan kesalahan. Ini adalah metode yang sama yang digunakan secara internal oleh metode sourcehook().
Tidak ada nilai yang dikembalikan.
Tidak ada contoh.
Keluarkan sumber masukan yang terakhir ditekan dari tumpukan masukan. Ini adalah metode yang sama yang digunakan secara internal ketika lexer mencapai EOF pada aliran input bertumpuk.
public void function Shlex::popSource( void )
Tidak ada parameter.
Tidak ada nilai yang dikembalikan.
Tidak ada contoh.
Kembalikan token.
public string|null|ShlexException function Shlex::getToken( void )
Tidak ada parameter.
Jika token telah ditumpuk menggunakan pushToken(), keluarkan token dari tumpukan. Jika tidak, baca satu dari aliran input. Jika pembacaan menemui akhir file langsung, eof dikembalikan (string kosong ('') dalam mode non-POSIX, dan null dalam mode POSIX).
Tidak ada contoh.
Baca token mentah.
public string|null|ShlexException function Shlex::readToken( void )
Baca token mentah. Abaikan tumpukan pushback, dan jangan menafsirkan permintaan sumber. (Ini biasanya bukan titik masuk yang berguna, dan didokumentasikan di sini hanya demi kelengkapan.)
Tidak ada parameter.
Kembalikan token mentah.
Tidak ada contoh.
public array function Shlex::sourcehook( string $newfile )
Ketika Shlex mendeteksi permintaan sumber (lihat sumber di bawah) metode ini diberikan token berikut sebagai argumen, dan diharapkan mengembalikan array nama file dan objek seperti file terbuka.
Biasanya, metode ini pertama-tama menghilangkan tanda kutip dari argumen. Jika hasilnya adalah nama jalur absolut, atau tidak ada permintaan sumber sebelumnya yang berlaku, atau sumber sebelumnya adalah aliran (misalnya php://stdin), maka hasilnya dibiarkan saja. Sebaliknya, jika hasilnya adalah nama path relatif, bagian direktori dari nama file tepat sebelum file tersebut berada di tumpukan penyertaan sumber akan diawali (perilaku ini seperti cara praprosesor C menangani #include "file.h").
Hasil manipulasi diperlakukan sebagai nama file, dan dikembalikan sebagai komponen pertama tupel, dengan fopen() dipanggil untuk menghasilkan komponen kedua. (Catatan: ini adalah kebalikan dari urutan argumen dalam inisialisasi instance!)
Kait ini diekspos sehingga Anda dapat menggunakannya untuk mengimplementasikan jalur pencarian direktori, penambahan ekstensi file, dan peretasan namespace lainnya. Tidak ada hook 'close' yang sesuai, tetapi instance shlex akan memanggil metode fclose() dari aliran input yang bersumber ketika ia mengembalikan EOF.
Untuk kontrol yang lebih eksplisit terhadap penumpukan sumber, gunakan metode pushSource() dan popSource().
jalur file.
Mengembalikan array nama file dan objek seperti file terbuka.
Tidak ada contoh.
Mengembalikan pemimpin pesan kesalahan dalam format label kesalahan kompiler Unix C.
public string function Shlex::errorLeader( string $infile = null, int|null $lineno = null )
Metode ini menghasilkan pemimpin pesan kesalahan dalam format label kesalahan kompiler Unix C; formatnya adalah '"%s", baris %d: ', di mana %s diganti dengan nama file sumber saat ini dan %d dengan nomor baris masukan saat ini (argumen opsional dapat digunakan untuk menimpanya) .
Kemudahan ini diberikan untuk mendorong pengguna Shlex menghasilkan pesan kesalahan dalam format standar yang dapat diuraikan yang dipahami oleh Emacs dan alat Unix lainnya.
Nama file sumber saat ini.
Nomor baris masukan saat ini.
Mengembalikan pemimpin pesan kesalahan dalam format label kesalahan kompiler Unix C.
Tidak ada contoh.
Kelas pengecualian Shlex
Kelas ini terutama digunakan untuk pengecualian yang diberikan ketika kelas Shlex secara internal melakukan kesalahan.
ShlexException extends Exception {}
<?php
throw new ShlexException('No escaped character');
?>