PHP regex: "at class 0 offset" nedir?

4 Cevap php

Ben şu hatayı alıyorum rağmen ben, basit bir düzenli ifade ve php preg_replace işlevini kullanarak bir dize dışında tüm noktalama şerit çalışıyorum:

Derleme başarısız oldu: POSIX adlı sınıflar sadece bir sınıf içinde desteklenir 0 ofset

Bu ben 0 ofset bir sınıfın dışında POSIX adlandırılmış sınıflarını kullanabilirsiniz anlamına gelir sanırım. Benim soru o "bir sınıf içinde 0 offset" dediğinde ne anlama geliyor, değil mi?

$string = "I like: perl";    

if (eregi('[[:punct:]]', $string))  
    $new = preg_replace('[[:punct:]]', ' ', $string); echo $new;

4 Cevap

preg_* fonksiyonlar expect Perl compatible regular expressions sınırlayıcı ile. Yani bu deneyin:

preg_replace('/[[:punct:]]/', ' ', $string)

NOTE: The g değiştirici PHP'nin PCRE uygulama ile gerekli değildir!

: Ilave olarak Gumbo's answer, noktalama all tekrarlarını değiştirmek için g değiştirici kullanmak

preg_replace('/[[:punct:]]/g', ' ', $string)
//                         ^

Johnathan Lonowski (yorumlar) Gönderen:

> [The g modifier] means "Global" -- i.e., find all existing matches. Without it, regex functions will stop searching after the first match.

why bu hata alıyorsanız bir açıklama: PCRE'yi bir ayırıcı ne Perl gevşek tanımını kullanır. Okumak için neden bu geçerli sınırlayıcı, gibi dış [] bakalım [:punct:] regex parçası olarak.

(- Onlar PHP 5.3 dahil edilecek gitmiyorsun sen eğer Oh, ve ereg işlevleri kaçının.)

Anwers birinde önerdiği gibi ben sadece regexp için g, bu Wahts tersi beklenen vermedi ve noktalama filtre YOKTU, bu ilk etapta küresel / özyinelemeli olduğu gibi preg_replace g gerektirmez çıkıyor