정규식 패턴을 적용하기 전에 이스케이프 할 수있는 PHP 함수가 있습니까?


161

정규식 패턴을 적용하기 전에 이스케이프 할 수있는 PHP 함수가 있습니까?

C # Regex.Escape()함수 의 선을 따라 무언가를 찾고 있습니다.

답변:


254

preg_quote() 당신이 찾고있는 것입니다 :

기술

string preg_quote ( string $str [, string $delimiter = NULL ] )

preg_quote ()str 정규 표현식 구문의 일부인 모든 문자 앞에 백 슬래시를 사용합니다. 일부 텍스트에서 일치해야하는 런타임 문자열이 있고 문자열에 특수 정규식 문자가 포함될 수있는 경우에 유용합니다.

특수 정규식 문자는 다음과 같습니다. . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

매개 변수

str

입력 문자열

구분자

선택적 분리 문자가 지정되면 이스케이프됩니다. 이것은 PCRE 기능에 필요한 분리 문자를 이스케이프 처리하는 데 유용합니다. /는 가장 일반적으로 사용되는 구분 기호입니다.

중요하게, $delimiter인수를 지정하지 않으면 정규식을 묶는 데 사용되는 문자 인 구분 기호 (일반적으로 슬래시 ( /))가 이스케이프되지 않습니다. 일반적으로 정규식과 함께 사용하는 구분 기호를 $delimiter인수 로 전달하려고합니다 .

예- preg_match공백으로 둘러싸인 주어진 URL을 찾는 데 사용 :

$url = 'http://stackoverflow.com/questions?sort=newest';

// preg_quote escapes the dot, question mark and equals sign in the URL (by
// default) as well as all the forward slashes (because we pass '/' as the
// $delimiter argument).
$escapedUrl = preg_quote($url, '/');

// We enclose our regex in '/' characters here - the same delimiter we passed
// to preg_quote
$regex = '/\s' . $escapedUrl . '\s/';
// $regex is now:  /\shttp\:\/\/stackoverflow\.com\/questions\?sort\=newest\s/

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
preg_match($regex, $haystack, $matches);

var_dump($matches);
// array(1) {
//   [0]=>
//   string(48) " http://stackoverflow.com/questions?sort=newest "
// }

11
@TomHaigh 답변에 대한 추가 설명 중 하나 는 두 번째 $delimiter인수를 지정하지 않으면 "default"(또는 가장 일반적인)조차도 preg_quote() 구분 기호를 이스케이프하지 않습니다 /.
Alix Axel

나는이 답변에 많은 것들을 추가했습니다-@AlixAxel이 $delimiter주장 의 중요성 , 문서에서 그 주장에 대한 설명, 정확히 무엇을 의미하는지에 대한 혼란에 대한 설명 및 심각하게 설명했습니다 preg_quote가장 간단한 경우에 사용되는 것을 보여주는 주석이 달린 예제 는 실제로 프로그래밍 방식으로 정규 표현식을 작성하고 다른 preg_*함수에 넣는 데 사용되는 위치를 생각해 낼 수 있습니다 (그렇지 않으면 요점이 무엇입니까?). 변경 사항이 마음에 들지 않으면 언제든지 롤백하십시오.
Mark Amery

1

T-Regx 라이브러리 에서 준비된 패턴 을 사용하는 것이 훨씬 안전합니다 .

$url = 'http://stackoverflow.com/questions?sort=newest';

$pattern = Pattern::prepare(['\s', [$url], '\s']);
                                // ↑ $url is quoted

그런 다음 정상적인 t-regx 일치 를 수행하십시오 .

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";

$matches = $pattern->match($haystack)->all();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.