Shlex는 C로 작성된 PHP 확장입니다. 이 확장은 Python에서 shlex 라이브러리의 기능을 구현합니다. 사용자가 Shlex 확장에 더 익숙해질 수 있도록 확장에 의해 구현된 클래스는 기본적으로 속성 및 메서드 이름 측면에서 Python shlex 라이브러리와 동일합니다. 인터페이스 문서도 Python shlex 라이브러리 인터페이스 문서에서 수정되었습니다.
Shlex를 사용하면 Unix 셸과 유사한 간단한 구문에 대한 어휘 분석기를 쉽게 작성할 수 있습니다. 이는 미니언어를 작성하거나 인용된 문자열을 구문 분석하는 데 종종 유용합니다.
phpize
./configure
make && make install
Windows 시스템은 현재 지원되지 않습니다.
쉘과 유사한 구문을 사용하여 문자열 s를 분할합니다.
array shlex_split( string|resource|null $s [, bool $comments = false [, bool $posix = true ]] )
쉘과 유사한 구문을 사용하여 문자열 s를 분할합니다.
Note:
Since the shlex_split() function instantiates a shlex instance, passing null for s will read the string to split from standard input.
comments가 false(기본값)인 경우 주어진 문자열의 댓글 구문 분석이 비활성화됩니다(shlex 인스턴스의 commenters 속성을 빈 문자열로 설정).
이 함수는 기본적으로 POSIX 모드에서 작동하지만 posix 인수가 false인 경우 비 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 모드에서는 null로 설정됩니다.
코멘트 초보자로 인식되는 문자열입니다. 주석 시작 부분부터 줄 끝까지의 모든 문자는 무시됩니다. 기본적으로 '#'만 포함됩니다.
다중 문자 토큰으로 누적되는 문자열입니다. 기본적으로 모든 ASCII 영숫자 및 밑줄이 포함됩니다. POSIX 모드에서는 Latin-1 세트의 악센트 문자도 포함됩니다. tempotionChars가 비어 있지 않은 경우 파일 이름 사양 및 명령줄 매개 변수에 나타날 수 있는 ~-./*?= 문자도 이 속성에 포함되며, puntationChars에 나타나는 모든 문자는 wordchars에서 제거됩니다. 거기에 있습니다.
공백으로 간주되어 건너뛰는 문자입니다. 공백 경계 토큰. 기본적으로 공백, 탭, 줄 바꿈 및 캐리지 리턴이 포함됩니다.
true인 경우 토큰은 공백으로만 분할됩니다. 예를 들어, 이는 Shlex로 명령줄을 구문 분석하고 쉘 인수와 유사한 방식으로 토큰을 얻는 데 유용합니다. 이 속성이 true인 경우 tempotionChars는 아무런 효과가 없으며 공백에서만 분할이 발생합니다. 쉘에 의해 구현된 구문 분석에 더 가까운 구문 분석을 제공하기 위해 temporationChars를 사용할 때 whitespaceSplit을 false(기본값)로 두는 것이 좋습니다.
문자열 따옴표로 간주되는 문자입니다. 동일한 인용문이 다시 나타날 때까지 토큰이 누적됩니다. 따라서 셸에서와 같이 서로 다른 인용문 유형이 서로를 보호합니다. 기본적으로 ASCII 작은따옴표와 큰따옴표가 포함됩니다.
탈출로 간주되는 문자입니다. 이는 POSIX 모드에서만 사용되며 기본적으로 ''만 포함됩니다.
이스케이프에 정의된 이스케이프 문자를 해석하는 따옴표 안의 문자입니다. 이는 POSIX 모드에서만 사용되며 기본적으로 '"'만 포함됩니다.
소스 줄 번호(지금까지 본 개행 개수에 1을 더한 값).
이 속성이 숫자이고 1 이상인 경우 Shlex 인스턴스는 해당 동작에 대한 자세한 진행 상황 출력을 인쇄합니다. 이를 사용해야 하는 경우 모듈 소스 코드를 읽고 세부 사항을 알아볼 수 있습니다.
토큰 버퍼. 예외를 포착할 때 이를 조사하는 것이 유용할 수 있습니다.
이 속성은 기본적으로 null입니다. 여기에 문자열을 할당하면 해당 문자열은 다양한 셸의 source 키워드와 유사한 어휘 수준 포함 요청으로 인식됩니다. 즉, 바로 다음 토큰이 파일 이름으로 열리고 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 인수가 null이면 이 infile 인수는 항상 null입니다.
posix 인수는 작동 모드를 정의합니다. posix가 false(기본값)이면 Shlex 인스턴스가 호환 모드에서 작동합니다. POSIX 모드에서 작동할 때 Shlex는 POSIX 쉘 구문 분석 규칙에 최대한 가깝게 노력합니다.
tempotionChars 인수는 동작을 실제 쉘이 구문 분석하는 방식에 더욱 가깝게 만드는 방법을 제공합니다. 이는 다양한 값(기본값은 false)을 취할 수 있습니다. true로 설정하면 문자 ();<>|&의 구문 분석이 변경됩니다. 이러한 문자(구두점 문자로 간주)의 모든 실행은 단일 토큰으로 반환됩니다. 비어 있지 않은 문자열로 설정되면 해당 문자가 구두점 문자로 사용됩니다.文字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 인터페이스의 next 메소드는 실제로 사용할 수 없습니다.
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 )
매개변수가 없습니다.
true가 반환되면 유효하고, false는 유효하지 않습니다.
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 );
푸시되는 입력 소스 스트림입니다.
filename 인수가 지정되면 나중에 오류 메시지에 사용할 수 있습니다. 이는 sourcehook() 메서드에서 내부적으로 사용하는 것과 동일한 메서드입니다.
값이 반환되지 않습니다.
예가 없습니다.
입력 스택에서 마지막으로 푸시된 입력 소스를 팝합니다. 이는 어휘 분석기가 스택 입력 스트림에서 EOF에 도달할 때 내부적으로 사용되는 것과 동일한 방법입니다.
public void function Shlex::popSource( void )
매개변수가 없습니다.
값이 반환되지 않습니다.
예가 없습니다.
토큰을 반환합니다.
public string|null|ShlexException function Shlex::getToken( void )
매개변수가 없습니다.
pushToken()을 사용하여 토큰이 쌓인 경우 스택에서 토큰을 팝합니다. 그렇지 않으면 입력 스트림에서 하나를 읽습니다. 읽기 중에 즉시 파일 끝이 발생하면 eof가 반환됩니다(POSIX 모드가 아닌 경우 빈 문자열(''), POSIX 모드에서는 null).
예가 없습니다.
원시 토큰을 읽습니다.
public string|null|ShlexException function Shlex::readToken( void )
원시 토큰을 읽습니다. 푸시백 스택을 무시하고 소스 요청을 해석하지 않습니다. (이것은 일반적으로 유용한 시작점이 아니며 완전성을 위해 여기에 문서화되었습니다.)
매개변수가 없습니다.
원시 토큰을 반환합니다.
예가 없습니다.
public array function Shlex::sourcehook( string $newfile )
Shlex가 소스 요청(아래 소스 참조)을 감지하면 이 메소드에는 다음 토큰이 인수로 제공되며 파일 이름 배열과 열린 파일 유사 객체를 반환할 것으로 예상됩니다.
일반적으로 이 방법은 먼저 인수에서 따옴표를 제거합니다. 결과가 절대 경로 이름이거나, 유효한 이전 소스 요청이 없었거나, 이전 소스가 스트림(예: php://stdin)인 경우 결과는 그대로 유지됩니다. 그렇지 않고 결과가 상대 경로 이름이면 소스 포함 스택에서 파일 이름 바로 앞에 있는 파일 이름의 디렉터리 부분이 앞에 추가됩니다(이 동작은 C 전처리기가 #include "file.h"를 처리하는 방식과 같습니다).
조작의 결과는 파일 이름으로 처리되고 튜플의 첫 번째 구성 요소로 반환되며, 두 번째 구성 요소를 생성하기 위해 fopen()이 호출됩니다. (참고: 이는 인스턴스 초기화의 인수 순서와 반대입니다!)
이 후크는 디렉토리 검색 경로, 파일 확장자 추가 및 기타 네임스페이스 해킹을 구현하는 데 사용할 수 있도록 노출됩니다. 해당 '닫기' 후크는 없지만 shlex 인스턴스는 EOF를 반환할 때 소스 입력 스트림의 fclose() 메서드를 호출합니다.
소스 스태킹을 보다 명시적으로 제어하려면 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');
?>