Shlex هو امتداد PHP مكتوب بلغة C. ينفذ هذا الامتداد وظيفة مكتبة shlex في Python. من أجل جعل المستخدمين أكثر دراية بامتداد Shlex، فإن الفئة التي ينفذها الامتداد هي في الأساس نفس مكتبة python shlex من حيث أسماء الخصائص والطرق. يتم أيضًا تعديل وثائق الواجهة من وثائق واجهة مكتبة python shlex.
يجعل Shlex من السهل كتابة محللات معجمية لبناء جمل بسيطة تشبه تلك الموجودة في Unix Shell. سيكون هذا مفيدًا غالبًا لكتابة اللغات المصغرة أو لتحليل السلاسل المقتبسة.
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 )
السلسلة المراد الهروب منها.
القيمة التي تم إرجاعها عبارة عن سلسلة يمكن استخدامها بأمان كرمز مميز في سطر أوامر Shell، في الحالات التي لا يمكنك فيها استخدام القائمة.
<?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، والحصول على الرموز المميزة بطريقة مشابهة لوسائط الصدفة. إذا كانت هذه السمة صحيحة، فلن يكون لأحرف الترقيم أي تأثير، ولن يحدث التقسيم إلا على المسافات البيضاء. عند استخدام علامات الترقيم، والتي تهدف إلى توفير تحليل أقرب إلى ذلك الذي يتم تنفيذه بواسطة الأصداف، فمن المستحسن ترك مسافة بيضاء كـ false (القيمة الافتراضية).
الأحرف التي سيتم اعتبارها علامات اقتباس سلسلة. يتراكم الرمز المميز حتى تتم مواجهة نفس الاقتباس مرة أخرى (وبالتالي، تحمي أنواع الاقتباس المختلفة بعضها البعض كما هو الحال في الصدفة.) بشكل افتراضي، يتضمن علامات الاقتباس المفردة والمزدوجة 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 ]]]])
تحدد الوسيطة المتدفقة، إذا كانت موجودة، المكان الذي سيتم قراءة الأحرف منه. يجب أن يكون متغيرًا لنوع المورد (يمكن قراءته بواسطة fread()) أو سلسلة. إذا لم يتم تقديم أي وسيطة، فسيتم أخذ الإدخال من php://stdin.
الوسيطة الاختيارية الثانية هي سلسلة اسم ملف، والتي تحدد القيمة الأولية للسمة infile. إذا كانت الوسيطة المتدفقة فارغة، فستكون الوسيطة infile هذه فارغة دائمًا.
تحدد الوسيطة posix وضع التشغيل: عندما يكون posix خطأ (افتراضي)، سيعمل مثيل Shlex في وضع التوافق. عند التشغيل في وضع POSIX، سيحاول Shlex أن يكون أقرب ما يكون إلى قواعد تحليل POSIX Shell.
توفر وسيطة علامات الترقيم طريقة لجعل السلوك أقرب إلى كيفية تحليل الأصداف الحقيقية. يمكن أن يستغرق هذا عددًا من القيم: القيمة الافتراضية، false. إذا تم التعيين على true، فسيتم تغيير تحليل الأحرف ();<>|&: يتم إرجاع أي تشغيل لهذه الأحرف (تعتبر أحرف علامات الترقيم) كرمز مميز واحد. إذا تم التعيين على سلسلة غير فارغة من الأحرف، فسيتم استخدام هذه الأحرف كأحرف علامات الترقيم. ستتم إزالة أي أحرف في سمة 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 )
لا توجد معلمات.
يتم إرجاع أية قيمة.
لا توجد أمثلة.
لا يوجد أي استخدام عملي لطريقة الترجيع لواجهة Iterator.
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().
يتم إرجاع أية قيمة.
لا توجد أمثلة.
قم بإخراج مصدر الإدخال الأخير من مكدس الإدخال. هذه هي نفس الطريقة المستخدمة داخليًا عندما يصل المعجم إلى EOF على دفق إدخال مكدس.
public void function Shlex::popSource( void )
لا توجد معلمات.
يتم إرجاع أية قيمة.
لا توجد أمثلة.
إرجاع رمز.
public string|null|ShlexException function Shlex::getToken( void )
لا توجد معلمات.
إذا تم تكديس الرموز المميزة باستخدام PushToken()، فقم بإخراج الرمز المميز من المكدس. بخلاف ذلك، اقرأ واحدة من دفق الإدخال. إذا واجهت القراءة نهاية فورية للملف، فسيتم إرجاع eof (السلسلة الفارغة ('') في وضع غير POSIX، وفارغة في وضع 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');
?>