Shlex เป็นส่วนขยาย PHP ที่เขียนด้วยภาษา C ส่วนขยายนี้ใช้ฟังก์ชันการทำงานของไลบรารี shlex ใน Python เพื่อให้ผู้ใช้คุ้นเคยกับส่วนขยาย Shlex มากขึ้น คลาสที่ใช้งานโดยส่วนขยายนั้นโดยพื้นฐานแล้วจะเหมือนกับไลบรารี python shlex ในแง่ของคุณสมบัติและชื่อเมธอด เอกสารประกอบอินเทอร์เฟซยังได้รับการแก้ไขจากเอกสารประกอบอินเทอร์เฟซไลบรารี python shlex
Shlex ทำให้ง่ายต่อการเขียนตัววิเคราะห์คำศัพท์สำหรับไวยากรณ์ง่ายๆ ที่คล้ายกับเชลล์ Unix สิ่งนี้มักจะมีประโยชน์สำหรับการเขียนภาษาย่อหรือสำหรับการแยกวิเคราะห์สตริงที่ยกมา
phpize
./configure
make && make install
ระบบ Windows ยังไม่รองรับในขณะนี้
แยกสตริงโดยใช้ไวยากรณ์คล้ายเชลล์
array shlex_split( string|resource|null $s [, bool $comments = false [, bool $posix = true ]] )
แยกสตริงโดยใช้ไวยากรณ์คล้ายเชลล์
Note:
Since the shlex_split() function instantiates a shlex instance, passing null for s will read the string to split from standard input.
หากความคิดเห็นเป็นเท็จ (ค่าเริ่มต้น) การแยกวิเคราะห์ความคิดเห็นในสตริงที่กำหนดจะถูกปิดใช้งาน (การตั้งค่าแอตทริบิวต์ผู้แสดงความคิดเห็นของอินสแตนซ์ shlex เป็นสตริงว่าง)
ฟังก์ชันนี้ทำงานในโหมด POSIX ตามค่าเริ่มต้น แต่จะใช้โหมดที่ไม่ใช่ POSIX หากอาร์กิวเมนต์ posix เป็นเท็จ
ส่งกลับอาร์เรย์ของสตริงแยก
<?php
$s = "foo#bar";
$ret = shlex_split($s, true);
var_dump($ret);
?>
ตัวอย่างข้างต้นจะแสดงผล:
array(1) {
[0] =>
string(3) "foo"
}
ส่งคืนสตริง s เวอร์ชันที่ยกเว้นด้วยเชลล์
string shlex_quote( string $s )
สตริงที่จะหลบหนี
ค่าที่ส่งคืนคือสตริงที่สามารถใช้เป็นโทเค็นเดียวในบรรทัดคำสั่งเชลล์ได้อย่างปลอดภัย ในกรณีที่คุณไม่สามารถใช้รายการได้
<?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";
?>
ตัวอย่างข้างต้นจะแสดงผล:
ls -l somefile; rm -rf index.php
ls -l 'somefile; rm -rf index.php'
ssh home 'ls -l '"'"'somefile; rm -rf index.php'"'"''
อินสแตนซ์ Shlex หรืออินสแตนซ์คลาสย่อยเป็นวัตถุตัววิเคราะห์คำศัพท์
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 );
}
สตรีมอินพุตที่อินสแตนซ์ Shlex นี้อ่านอักขระ
ชื่อของไฟล์อินพุตปัจจุบัน ตามที่ตั้งค่าเริ่มแรกในเวลาการสร้างอินสแตนซ์ของคลาสหรือซ้อนกันโดยคำขอแหล่งที่มาในภายหลัง อาจมีประโยชน์ในการตรวจสอบสิ่งนี้เมื่อสร้างข้อความแสดงข้อผิดพลาด
โทเค็นใช้เพื่อกำหนดจุดสิ้นสุดของไฟล์ สิ่งนี้จะถูกตั้งค่าเป็นสตริงว่าง ('') ในโหมดที่ไม่ใช่ POSIX และเป็นโมฆะในโหมด POSIX
สตริงอักขระที่ได้รับการยอมรับว่าเป็นผู้เริ่มต้นแสดงความคิดเห็น อักขระทั้งหมดตั้งแต่ความคิดเห็นเริ่มต้นจนถึงท้ายบรรทัดจะถูกละเว้น รวมเพียง '#' ตามค่าเริ่มต้น
สตริงอักขระที่จะสะสมเป็นโทเค็นหลายอักขระ ตามค่าเริ่มต้น จะรวมตัวอักษรและตัวเลข ASCII และขีดล่างทั้งหมด ในโหมด POSIX จะมีการรวมอักขระเน้นเสียงในชุด Latin-1 ไว้ด้วย หากเครื่องหมายวรรคตอนไม่ว่างเปล่า อักขระ ~-./*?= ซึ่งสามารถปรากฏในข้อกำหนดชื่อไฟล์และพารามิเตอร์บรรทัดคำสั่ง จะรวมอยู่ในแอตทริบิวต์นี้ด้วย และอักขระใดๆ ที่ปรากฏในเครื่องหมายวรรคตอนจะถูกลบออกจากอักษรคำหากเป็น อยู่ที่นั่น
อักขระที่จะถือเป็นช่องว่างและข้ามไป โทเค็นขอบเขตช่องว่าง ตามค่าเริ่มต้น รวมถึงช่องว่าง แท็บ การป้อนบรรทัด และการขึ้นบรรทัดใหม่
หากเป็นจริง โทเค็นจะถูกแบ่งออกเป็นช่องว่างเท่านั้น สิ่งนี้มีประโยชน์ ตัวอย่างเช่น สำหรับการแยกวิเคราะห์บรรทัดคำสั่งด้วย Shlex การรับโทเค็นในลักษณะเดียวกันกับอาร์กิวเมนต์ของเชลล์ หากแอตทริบิวต์นี้เป็นจริง เครื่องหมายวรรคตอนจะไม่มีผลใดๆ และการแยกจะเกิดขึ้นเฉพาะในช่องว่างเท่านั้น เมื่อใช้เครื่องหมายวรรคตอนChars ซึ่งมีจุดประสงค์เพื่อให้การแยกวิเคราะห์ใกล้เคียงกับที่เชลล์นำมาใช้ ขอแนะนำให้ปล่อย whitespaceSplit เป็นเท็จ (ค่าเริ่มต้น)
อักขระที่จะถือเป็นเครื่องหมายคำพูดแบบสตริง โทเค็นจะสะสมจนกว่าจะพบใบเสนอราคาเดียวกันอีกครั้ง (ดังนั้น ประเภทใบเสนอราคาที่แตกต่างกันจะปกป้องกันเช่นเดียวกับในเชลล์) ตามค่าเริ่มต้น จะรวมเครื่องหมายคำพูดเดี่ยวและคู่ของ ASCII
ตัวละครที่จะถือเป็นการหลบหนี สิ่งนี้จะใช้ในโหมด POSIX เท่านั้น และรวมเพียง '' เป็นค่าเริ่มต้น
อักขระในเครื่องหมายคำพูดที่จะตีความอักขระหลีกที่กำหนดไว้ในการหลีก ใช้เฉพาะในโหมด POSIX และรวมเพียง '"' ตามค่าเริ่มต้น
หมายเลขบรรทัดต้นทาง (จำนวนบรรทัดใหม่ที่เห็นจนถึงตอนนี้บวกหนึ่ง)
หากแอตทริบิวต์นี้เป็นตัวเลขและตั้งแต่ 1 ขึ้นไป อินสแตนซ์ Shlex จะพิมพ์ผลลัพธ์ความคืบหน้าโดยละเอียดเกี่ยวกับลักษณะการทำงาน หากคุณจำเป็นต้องใช้สิ่งนี้ คุณสามารถอ่านซอร์สโค้ดของโมดูลเพื่อเรียนรู้รายละเอียดได้
บัฟเฟอร์โทเค็น อาจมีประโยชน์ในการตรวจสอบสิ่งนี้เมื่อตรวจพบข้อยกเว้น
คุณลักษณะนี้เป็นโมฆะตามค่าเริ่มต้น หากคุณกำหนดสตริงให้กับสตริงนั้น สตริงนั้นจะได้รับการยอมรับว่าเป็นคำขอรวมระดับคำศัพท์ที่คล้ายกับคีย์เวิร์ดแหล่งที่มาในเชลล์ต่างๆ นั่นคือ โทเค็นต่อไปนี้ทันทีจะถูกเปิดเป็นชื่อไฟล์ และอินพุตจะถูกดึงมาจากสตรีมนั้นจนกระทั่ง EOF ซึ่ง ณ จุดนี้เมธอด fclose() ของสตรีมนั้นจะถูกเรียก และแหล่งอินพุตจะกลายเป็นสตรีมอินพุตดั้งเดิมอีกครั้ง คำขอแหล่งที่มาอาจซ้อนกันลึกกี่ระดับก็ได้
ตัวละครที่จะถือเป็นเครื่องหมายวรรคตอน การเรียกใช้อักขระเครื่องหมายวรรคตอนจะถูกส่งกลับเป็นโทเค็นเดียว อย่างไรก็ตาม โปรดทราบว่าจะไม่มีการตรวจสอบความถูกต้องเชิงความหมาย ตัวอย่างเช่น '>>>' สามารถส่งคืนเป็นโทเค็นได้ แม้ว่าเชลล์อาจไม่ได้รับการยอมรับเช่นนั้นก็ตาม
ตัวสร้าง
public void function Shlex::__construct( [ string|resource|null $instream = null [, string|null $infile = null [, bool $posix = false [, string|bool|null $punctuationChars = false ]]]])
อาร์กิวเมนต์ instream (หากมี) จะระบุตำแหน่งที่จะอ่านอักขระ ต้องเป็นตัวแปรประเภททรัพยากร (สามารถอ่านได้โดย fread( )) หรือสตริง หากไม่มีการระบุอาร์กิวเมนต์ ข้อมูลจะถูกดึงมาจาก php://stdin
อาร์กิวเมนต์ทางเลือกที่สองคือสตริงชื่อไฟล์ ซึ่งตั้งค่าเริ่มต้นของแอตทริบิวต์ infile หากอาร์กิวเมนต์ instream เป็นโมฆะ อาร์กิวเมนต์ infile นี้จะเป็นโมฆะเสมอ
อาร์กิวเมนต์ posix กำหนดโหมดการทำงาน: เมื่อ posix เป็นเท็จ (ค่าเริ่มต้น) อินสแตนซ์ Shlex จะทำงานในโหมดความเข้ากันได้ เมื่อทำงานในโหมด POSIX Shlex จะพยายามให้ใกล้เคียงกับกฎการแยกวิเคราะห์เชลล์ POSIX มากที่สุด
อาร์กิวเมนต์เครื่องหมายวรรคตอนChars มีวิธีทำให้พฤติกรรมใกล้เคียงกับการแยกวิเคราะห์เชลล์จริงมากขึ้น ซึ่งอาจต้องใช้ค่าจำนวนหนึ่ง: ค่าเริ่มต้น, เท็จ หากตั้งค่าเป็นจริง การแยกวิเคราะห์อักขระ ();<>|& จะเปลี่ยนไป: การเรียกใช้อักขระเหล่านี้ (ซึ่งถือเป็นอักขระเครื่องหมายวรรคตอน) จะถูกส่งกลับเป็นโทเค็นเดียว หากตั้งค่าเป็นสตริงอักขระที่ไม่ว่างเปล่า อักขระเหล่านั้นจะถูกใช้เป็นอักขระเครื่องหมายวรรคตอน อักขระใดๆ ในคุณลักษณะ wordchars ที่ปรากฏในเครื่องหมายวรรคตอนจะถูกลบออกจาก wordchars
ไม่มีการส่งคืนค่า
<?php
$instance = new Shlex("a && b || c", null, false, "|");
$list = [];
foreach ($instance as $value) {
$list[] = $value;
}
var_dump($list);
?>
ตัวอย่างข้างต้นจะแสดงผล:
array(6) {
[0] =>
string(1) "a"
[1] =>
string(1) "&"
[2] =>
string(1) "&"
[3] =>
string(1) "b"
[4] =>
string(2) "||"
[5] =>
string(1) "c"
}
ผู้ทำลายล้าง
public void function Shlex::__destruct( void )
ใช้เพื่อปล่อยวัตถุทรัพยากรที่ถือโดยวัตถุ Shlex ภายใน fclose( ) ถูกเรียกเพื่อปิดตัวจัดการไฟล์
ไม่มีพารามิเตอร์
ไม่มีการส่งคืนค่า
ไม่มีตัวอย่าง
ไม่มีการใช้งานจริงสำหรับวิธีการสำคัญของอินเทอร์เฟซ Iterator
public void function Shlex::key( void )
ไม่มีพารามิเตอร์
ไม่มีการส่งคืนค่า
ไม่มีตัวอย่าง
ไม่มีการใช้งานจริงสำหรับวิธีถัดไปของอินเทอร์เฟซ Iterator
public void function Shlex::next( void )
ไม่มีพารามิเตอร์
ไม่มีการส่งคืนค่า
ไม่มีตัวอย่าง
ไม่มีการใช้งานจริงสำหรับวิธีการกรอกลับของอินเทอร์เฟซตัววนซ้ำ
public void function Shlex::rewind( void )
ไม่มีพารามิเตอร์
ไม่มีการส่งคืนค่า
ไม่มีตัวอย่าง
ส่งกลับค่าโทเค็นที่ Shlex อ่านซ้ำนี้
public string|null function Shlex::current( void )
ไม่มีพารามิเตอร์
ส่งกลับค่าโทเค็นที่ Shlex อ่านซ้ำนี้
ไม่มีตัวอย่าง
ตรวจสอบว่าการวนซ้ำนี้ถูกต้องหรือไม่
public bool function Shlex::valid( void )
ไม่มีพารามิเตอร์
ถูกต้องหากส่งคืนจริง เท็จไม่ถูกต้อง
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.
ไม่มีตัวอย่าง
พุชอาร์กิวเมนต์ลงบนโทเค็นสแต็ก
public void function Shlex::pushToken( string $tok )
พารามิเตอร์ที่ถูกผลัก
ไม่มีการส่งคืนค่า
ไม่มีตัวอย่าง
พุชสตรีมแหล่งอินพุตไปยังสแต็กอินพุต
public void function Shlex::pushSource( string|resource $newstream, string|null $newfile = null );
สตรีมแหล่งอินพุตถูกผลัก
หากมีการระบุอาร์กิวเมนต์ชื่อไฟล์จะสามารถใช้งานได้ในภายหลังในข้อความแสดงข้อผิดพลาด นี่เป็นวิธีเดียวกับที่ใช้ภายในโดยเมธอด sourcehook()
ไม่มีการส่งคืนค่า
ไม่มีตัวอย่าง
เปิดแหล่งอินพุตที่พุชล่าสุดจากสแต็กอินพุต นี่เป็นวิธีการเดียวกับที่ใช้ภายในเมื่อ lexer ไปถึง EOF บนสตรีมอินพุตแบบสแต็ก
public void function Shlex::popSource( void )
ไม่มีพารามิเตอร์
ไม่มีการส่งคืนค่า
ไม่มีตัวอย่าง
ส่งคืนโทเค็น
public string|null|ShlexException function Shlex::getToken( void )
ไม่มีพารามิเตอร์
หากโทเค็นถูกซ้อนกันโดยใช้ pushToken() ให้เปิดโทเค็นออกจากสแต็ก มิฉะนั้น ให้อ่านจากสตรีมอินพุต หากการอ่านพบการสิ้นสุดไฟล์ในทันที eof จะถูกส่งกลับ (สตริงว่าง ('') ในโหมดที่ไม่ใช่ POSIX และค่า null ในโหมด POSIX)
ไม่มีตัวอย่าง
อ่านโทเค็นดิบ
public string|null|ShlexException function Shlex::readToken( void )
อ่านโทเค็นดิบ ละเว้นสแต็กการตอบกลับ และอย่าตีความคำขอแหล่งที่มา (โดยปกติแล้วนี่ไม่ใช่จุดเริ่มต้นที่มีประโยชน์ และจะบันทึกไว้ที่นี่เพื่อความครบถ้วนเท่านั้น)
ไม่มีพารามิเตอร์
ส่งคืนโทเค็นดิบ
ไม่มีตัวอย่าง
public array function Shlex::sourcehook( string $newfile )
เมื่อ Shlex ตรวจพบคำขอแหล่งที่มา (ดูแหล่งที่มาด้านล่าง) วิธีการนี้จะได้รับโทเค็นต่อไปนี้เป็นอาร์กิวเมนต์ และคาดว่าจะส่งคืนอาร์เรย์ของชื่อไฟล์และวัตถุที่มีลักษณะคล้ายไฟล์ที่เปิดอยู่
โดยปกติแล้ว วิธีนี้จะตัดเครื่องหมายคำพูดออกจากอาร์กิวเมนต์ก่อน หากผลลัพธ์เป็นชื่อพาธสัมบูรณ์ หรือไม่มีการร้องขอแหล่งที่มาก่อนหน้านี้ หรือแหล่งที่มาก่อนหน้าคือสตรีม (เช่น php://stdin) ผลลัพธ์จะถูกทิ้งไว้ตามลำพัง มิฉะนั้น หากผลลัพธ์เป็นชื่อพาธแบบสัมพันธ์ ส่วนไดเร็กทอรีของชื่อไฟล์ที่อยู่ก่อนหน้านั้นบนสแต็กการรวมต้นทางจะถูกเติมไว้ข้างหน้า (ลักษณะการทำงานนี้เหมือนกับวิธีที่ตัวประมวลผลล่วงหน้าของ C จัดการ #include "file.h")
ผลลัพธ์ของการปรับแต่งจะถือเป็นชื่อไฟล์และส่งคืนเป็นองค์ประกอบแรกของทูเพิล โดยที่ fopen() เรียกใช้เพื่อให้ได้องค์ประกอบที่สอง (หมายเหตุ: นี่เป็นการย้อนกลับของลำดับอาร์กิวเมนต์ในการเริ่มต้นอินสแตนซ์!)
ฮุคนี้ถูกเปิดเผยเพื่อให้คุณสามารถใช้เพื่อใช้เส้นทางการค้นหาไดเร็กทอรี การเพิ่มนามสกุลไฟล์ และแฮ็กเนมสเปซอื่นๆ ไม่มีฮุก 'ปิด' ที่สอดคล้องกัน แต่อินสแตนซ์ shlex จะเรียกใช้เมธอด fclose() ของสตรีมอินพุตต้นทางเมื่อมันส่งคืน EOF
หากต้องการควบคุมการซ้อนแหล่งที่มาได้ชัดเจนยิ่งขึ้น ให้ใช้เมธอด pushSource() และ popSource()
เส้นทางไฟล์
กลับอาร์เรย์ของชื่อไฟล์และวัตถุที่เปิดเหมือนไฟล์
ไม่มีตัวอย่าง
ส่งคืนผู้นำข้อความแสดงข้อผิดพลาดในรูปแบบของป้ายกำกับข้อผิดพลาดของคอมไพเลอร์ Unix C
public string function Shlex::errorLeader( string $infile = null, int|null $lineno = null )
วิธีการนี้จะสร้างผู้นำข้อความแสดงข้อผิดพลาดในรูปแบบของป้ายข้อผิดพลาดของคอมไพเลอร์ Unix C รูปแบบคือ '"%s" บรรทัด %d: ' โดยที่ %s ถูกแทนที่ด้วยชื่อของไฟล์ต้นฉบับปัจจุบัน และ %d ด้วยหมายเลขบรรทัดอินพุตปัจจุบัน (อาร์กิวเมนต์ทางเลือกสามารถใช้เพื่อแทนที่สิ่งเหล่านี้) .
ความสะดวกนี้มีไว้เพื่อสนับสนุนให้ผู้ใช้ Shlex สร้างข้อความแสดงข้อผิดพลาดในรูปแบบมาตรฐานที่สามารถแยกวิเคราะห์ได้ซึ่ง Emacs และเครื่องมือ Unix อื่นๆ เข้าใจได้
ชื่อของไฟล์ต้นฉบับปัจจุบัน
หมายเลขบรรทัดอินพุตปัจจุบัน
ส่งคืนผู้นำข้อความแสดงข้อผิดพลาดในรูปแบบของป้ายกำกับข้อผิดพลาดของคอมไพเลอร์ Unix C
ไม่มีตัวอย่าง
คลาสข้อยกเว้นของ Shlex
คลาสนี้ใช้เป็นหลักสำหรับข้อยกเว้นที่เกิดขึ้นเมื่อคลาส Shlex ทำข้อผิดพลาดภายใน
ShlexException extends Exception {}
<?php
throw new ShlexException('No escaped character');
?>