How to fix the "Warning: preg_replace(): The /e modifier is no longer supported" error in PHP7 - Seditio Yazılım - Seditio CMS Türkiye

Yayınımız yeniliklerle beraber yeni sitemizden devam ediyor. Seditio.com.tr takip edin.

User profile picture

Kaan

Seditio CMS

How to fix the "Warning: preg_replace(): The /e modifier is no longer supported" error in PHP7

PHP5.x'ten PHP7'ye yükseltme yaparken en sık karşılaşılan sorunlardan biri şu şekildedir:

Uyarı: preg_replace (): / e değiştiricisi artık desteklenmiyor, bunun yerine preg_replace_callback işlevini kullanın

PHP kılavuzunda iyi belgelenmiş bir sorun olmasına rağmen  (v5.5'ten beri kullanımdan kaldırılmıştır ve v7.0.0'dan beri desteklenmemektedir), yukarıdaki uyarı, bir geliştiricinin yükseltmeyi gerçekleştirirken karşılaşabileceği en sinir bozucu geriye dönük uyumsuz değişikliklerden biridir: önerilen düzeltme - kodu daha yeni ve daha sağlam preg_replace_callback işlevini kullanarak yeniden uygulamak - her zaman kolay değildir, çünkü / e değiştiricisiyle  birlikte preg_replace kullanımı  birkaç yıl öncesine kadar PHP tabanlı komut dosyaları, uygulamalar ve arayüzler arasında oldukça yaygındı.

Aşağıdaki gönderide, sorunu çözmek için kullanabileceğimiz üç yöntemi paylaşıyoruz: kendi senaryonuz için en uygun olanı seçmekten çekinmeyin.

Düzeltme 1: Plana Bağlı Kal

Yapmamız gereken ilk şey, güncellenmiş preg_replace_callback işlevini etkili bir şekilde kullanıp kullanamayacağımızı kontrol etmek  ve kodumuzu buna göre değiştirmektir. Söylemeye gerek yok, bu sorunu çözmenin en uygun yoludur, çünkü normal ifade tabanlı dize değiştirmeleri için geliştirilmiş PHP 7 yaklaşımını sıkı bir şekilde takip eder: temel alınan eval ( / e anahtarının anlamı  buydu  ) ve bir bunun yerine uygun temsilci yöntemi .

Belirli bir dizedeki tüm küçük harfleri büyük harfe dönüştürmek için kullanılabilecek "eski" bir  preg_replace uygulama örneği:

$str = preg_replace("/([a-z]*)/e", "strtoupper('\\1')", $str);

İşte karşılık gelen, PHP7 için geçerli preg_replace_callback  sürümü ( PHP5'te  de çalışır):

$str = preg_replace_callback( "/([a-z]*)/",
function($matches){
 foreach($matches as $match){
 return strtoupper($match);
 }
 }, 
 $str
);

Gördüğümüz gibi, temelde yapılacak üç şey var:

  • Kullanım  preg_replace_callback  yerine  preg_replace .
  • Kaldır / e diğer tüm olanları tutarak arama regex dizenin sonuna kadar değiştirici:
    / e ile değiştirilmesi gerekir
    / ,
    / uise ile
    / uis ,
    #ise ile
    #is
     ve böylece sözdizimi PHP bağlı olarak değişebilir (ilgili senaryo).
  • İkinci parametreyi (bir işlev olarak değerlendirilecek) yalnızca bir dizeden daha sağlam bir geri arama işlevine değiştirin ve ikame dizenin kendisini döndürür : eski dizge ile geri arama işlevi tarafından döndürülen arasındaki tek gerçek fark, eklemenin yoludur eşleşen değerler:
    \ \ 1 ,
    \ \ 2 ,
    \ \ 3
     (vb.) gibi çirkin yer tutucular kullanmak yerine, bunu da çift çıkış yapmamız gerekir, işlevimiz tarafından kabul edilen kullanışlı
    $degerler girdi parametresini kullanabiliriz bir dizi olarak. Yukarıdaki kod bunu nasıl yapabileceğimizi gösteriyor.

Düzeltme # 2: Sistemi Kandır

Bu tür senaryolarla karşı karşıyaysanız ve çaresizce bir çıkış yoluna ihtiyacınız varsa, yapabileceğiniz "en iyi" şey, desteklenmeyen / e değiştiriciyi  aşağıdaki şekilde gerçek bir eval () çağrısıyla değiştirmektir :

$dizi = preg_replace_callback($preg['search'], 
        function($m) use($preg) { 
            $rep = $preg['replace'][1]; 
            for ($i = 1; $i<count($m); $i++) { 
                $rep = str_replace('\\'.$i, '$m['.$i.']', $rep); 
                $rep = str_replace('\$'.$i, '$m['.$i.']', $rep); 
            } 
            eval('$str='.$rep); 
            return $str;
        }, 
    $dizi);

Biliyoruz, bu neredeyse hırsızlık kadar kötü… ve yine de, eval () işlevini kullanabileceğinizi varsayarak ( bariz güvenlik nedenleriyle çoğu sağlayıcı tarafından devre dışı bırakılan ) işi halleder .

3 Numaralı Düzeltme: Hataları Gizleyin

2. yöntem kötüyse, bu daha da kötüdür. Bunu önermemizin tek nedeni , komut dosyası kaynak kodunda önemli değişiklikler yapamayan ve düzeltemiyor olsalar bile uyarıyı geçici olarak gizlememiz gerekenler için hızlı bir çözüm sağlamamızın istenmesiydi.

$current_error_reporting = error_reporting(); // backup current error reporting settings
error_reporting($current_error_reporting ^ ( E_WARNING )); // prevent E_WARNING messages from being shown
$dizi = preg_replace($preg['search'], $preg['replace'], $dizi); // perform the (flawed) preg_replace call
error_reporting($current_error_reporting); // restore the former error reporting settings

Bu düzeltme , E_DEPRECATED ve / veya E_STRICT seviye mesajlarını tamamen kapatmadan , PHP <= 5.4'ten PHP 5.5'e yükseltme yapanlar için de çok yararlı olabilir - bu hala / e değiştiriciyi destekliyor ancak kullanımdan kaldırıldığına dair bir uyarı veriyor. Söylemeye gerek yok, PHP 5.5.x için kullanmayı planlıyorsanız, değiştirdiğinizden emin olun.

E_WARNING ile E_DEPRECATED | E_STRICT bunun yerine 2. satırda.

Bu “carpet-based” stratejiden daha da fazla yararlanmak istiyorsanız, örneğin PHP'nin bazı hataları PHP_errors.log dosyasına program yoluyla kaydetmesini önlemek için, bu yazıyı okumanızı şiddetle tavsiye ederiz . Ancak, komut dosyası hatalarınızı gizlemenin neredeyse her zaman yapabileceğiniz en kötü şey olduğunu anlamak çok önemlidir: devam etmeden önce yaptığınız şeyin tüm sonuçlarını ve olası sonuçlarını anladığınızdan emin olun.

Yararlı referanslar


how to fix the "warning: preg_replace(): the /e modifier is no longer supported" error in php7

Yorumlar

Henüz yorum yapılmamıştır.