Regex kalıpları uygulanmadan kaçabilecek bir PHP işlevi var mı?


Yanıtlar:


255

preg_quote() aradığınız şey:

Açıklama

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

preg_quote () alır str ve düzenli ifade sözdizimi bir parçası olan her karakterin önüne bir ters eğik çizgi koyar. Bazı metinde eşleştirmeniz gereken bir çalışma zamanı dizeniz varsa ve dize özel normal ifade karakterleri içeriyorsa bu yararlıdır.

Özel normal ifade karakterleri: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Parametreler

str

Giriş dizesi.

sınırlayıcı

İsteğe bağlı sınırlayıcı belirtilirse, bu değerden de kaçılır. Bu, PCRE işlevleri için gerekli olan sınırlayıcıdan kaçmak için kullanışlıdır. / En sık kullanılan sınırlayıcıdır.

Önemli olarak, $delimiterbağımsız değişken belirtilmezse, regex'inizi, genellikle eğik çizgiyi ( ) içine almak için kullanılan karakter olan ayırıcıdan çıkılmayacağını unutmayın /. Genellikle $delimiterargümanınız olarak normal ifadenizle kullandığınız sınırlayıcıyı geçmek istersiniz .

Örnek - preg_matchboşlukla çevrili belirli bir URL'nin oluşumlarını bulmak için kullanma :

$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 yanıtı için ek bir açıklama , eğer ikinci $delimiterargümanı belirtmezseniz, preg_quote() herhangi bir sınırlayıcıdan kaçmaz , "varsayılan" (veya en yaygın) bile /.
Alix Axel

Bu cevaba bir sürü şey ekledim - @AlixAxel tarafından $delimiterargümanın önemi , dokümanlardaki bu argümanın açıklaması, tam olarak ne anlama geldiği hakkında karışıklık için bir açıklama ve yoğun bir şekilde ortaya çıkan not preg_quoteen basit durumda kullanıldığını gösteren yorumlanmış bir örnek , aslında bir regex oluşturmak ve başka bir preg_*işleve koymak için kullanıldığı yerde ortaya çıkabilir (aksi takdirde, amaç nedir?). Değişikliği beğenmezseniz geri dönmekten çekinmeyin.
Mark Amery

1

Kullanımı çok daha güvenli olacağını Hazırlanan Kalıpları gelen T-RegX kütüphanesinde :

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

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

sonra normal t-regx eşleşmesini gerçekleştirin:

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

$matches = $pattern->match($haystack)->all();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.