2010-12-22 18 views
12

olmadan oluşturuldu mu algıladıysanız, çok baytlı dizeler için \P ifadelerini içeren bir dizi normal ifade kullanan bir PHP kitaplığı var.PCRE, --enable-unicode özellikleri veya --enable-utf8 yapılandırma anahtarları

((((?:\P{M}\p{M}*)+?)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d+) 

Bu, çoğu yapı üzerinde çalışırken, regexp ile ilgili bir hata döndüren birkaç rapor aldım.

Çalışma platformu bağlı olarak, PCRE'den hata iletileri şunlardır:

Derleme başarısız: PCRE'nin \ L desteklemez, \ l \ N \ p \ p \ U \ u, \ P, \ p için destek ve \ X

n ofset derlenmemiştir n

veya

Compilation ofset veya \ x başarısız

Kodumun başında \P kullanan bir regexp'i test ettiğimi ve döndürülen bir hatayı yakalayabileceğimi biliyorum, ardından bu yanıtı uyumluluk bayrağı ayarlamak ve bozulmamış (UTF-8 olmayan) bir regexp sağlamak için kullanabilirsiniz. Bu uyumluluk bayrağına dayanan kodumun ana gövdesi içinde \P. PCRE --enable-unicode-properties veya --enable-utf8 yapılandırma anahtarlar olmadan inşa edilmişti olmadığını belirlemek için herhangi basit bir yolu olup olmadığını

merak ediyordum. PHP, PCRE_VERSION sabitine erişim sağlar, ancak bu, \P desteğinin etkin olup olmadığını tanımlamaya yardımcı olmaz. deneyerek dışında

+3

... bastırılabilirdi uyarı ile bir kez basit Regexp'i çalışıyor. Derlenmediği platformlarda bu sabitin mevcut olup olmadığını kontrol edin ('PREG_BAD_UTF8_OFFSET ');') Eğer yoksa, çekiniz var. Eğer yaparsa, phpinfo() 'yi her zaman ayrıştırabilirsiniz, ancak bu ucuz olmaz ... – ircmaxell

+0

phpinfo() aslında bu bilgiyi sağlamıyor ... Ben zaten kontrol ettim. Yeni bir PCRE benim test sunuculardan birinde üzerine inşa edilecek ve PREG_BAD_UTF8_OFFSET tanımlanması durumunda ben sadece tanımlanmış bir sabit test başardı eğer, bu benim son çare için daha temiz bir alternatif oluşturacaktır görmek için buna karşı PHP yeniden yapacağız. –

+0

PCRE, PHP tarafından derlendiği için PHP için bir konfigürasyon seçeneği olmamalı mı? (anlamı Phpinfo'nun 'configure' satırında görünmüyor)? PHP hiçbir ekstra PHP yapılandırma ayarları ile, dahili PCRE, varsayılan olarak etkinleştirilmiş tüm PCRE baytlı seçenekleri ile yerleşik kullanıyorsa ben – ircmaxell

cevap

3

, tek yolun -C seçeneği (derleme zamanı seçenekleri) ile pcretest komut satırı aracı kullanmaktır düşünüyorum: comments PREG_BAD_UTF8_ERROR PHP kaynak için

bash-4.1.5$ pcretest -C 
    No UTF-8 support 
    No Unicode properties support 
    Newline sequence is LF 
    \R matches all Unicode newlines 
    Internal link size = 2 
    POSIX malloc threshold = 10 
    Default match limit = 10000000 
    Default recursion depth limit = 10000000 
    Match recursion uses stack 
+3

PCRE'nin beri yardım etmez misin PHP kaynak paketinde PHP dokümanlar kontrol ettikten sonra kullanarak sona erdi o PREG_BAD_UTF8_ERROR idi (ve dolayısıyla sunucuda yüklü olandan farklı bir derleme kullanabilir (sunucuda kuruluysa) ... Örneğin, PCRE sistemlerimden birinde 6.6, ancak PHP'nin PCRE sürümü 8.02 ... – ircmaxell

+2

Ne yazık ki doğru, PHP Nasıl oluşturulduğuna bağlı olarak kendi PCRE'sini veya sunucudan bir PCRE kullanın. –

1

atmanız önerilir iken http://lxr.php.net/xref/PHP_5_6/ext/pcre/php_pcre.c#141, PCRE ise bu sabitin her zaman kullanılabilir olduğunu önerir. Gerçekten de --enable-unicode-properties'un bir PCRE lib anahtarı olduğu ve PHP tarafından açıklanmadığı anlaşılmaktadır. Tahmin edebiliyorum tek şey utf8 desteği ile derlemek olmasaydı `PREG_BAD_UTF8_OFFSET` tanımlanabilir merak ediyorum

İlgili konular