Neden bu standart Reg Ex PHP'nin ereg fonksiyonu çalışmaz

8 Cevap php

Ben Reg Ex bir acemi biraz duyuyorum ve tamamen farklı tatlar arasındaki farkı anlayamıyorum. Ancak, ben PHP'nin ereg fonksiyonları kullanmaya çalıştığınızda ben değil UNIX sistem (vi ve grep) yoluyla deneyin ama zaman çalışan bir temel Reg Ex var. Ben bu işe yapıyor PHP ereg işlevi hakkında farklı bir şey olduğunu sanıyorum:

<?php
$string = 'Feugiat <em>hendrerit</em> sit iriuredolor aliquam.';
$string = ereg_replace("<em\b[^>]*>(.*?)</em>","\\1",$string);
echo $string;
?>

Ben em etiketleri olmadan çıktı Feugiat hendrerit sit iriuredolor aliquam. için bu istiyorum. Ancak bu sadece boş bir dize döndürür.

8 Cevap

PHP'nin ereg fonksiyonları denilen çok sınırlı bir regex lezzet kullanmak POSIX ERE. My flavor comparison, bu tat modern bir tatlar ile karşılaştırıldığında tüm yoksun olduğunu gösterir.

Senin durumunda, sözcük sınır \ b desteklenmiyor. Bir hata olarak sıkı bir POSIX uygulama iradesi bayrak \ b.

Sizin çözüm yerine gebelik işlevlerini kullanmak için:

preg_replace('!<em\b[^>]*>(.*?)</em>!', '$1', $string);

Diğer cevapları ile karşılaştırıldığında aldığınız: \ b ters eğik kaçış ve değiştirilmesi için 1 $ kullanmayınız. preg_replace ereg_replace farklı bir yerine metin sözdizimi kullanır.

Sen ters eğik çizgi kaçış gerekebilir:

$string = ereg_replace("<em\\b[^>]*>(.*?)</em>","\\1",$string);

Bir PHP dizge içinde bir normal ifadede bir \b farklı bir şey anlamına gelir \b çünkü bu. \\ PHP dize kullanarak ereg_replace() tek bir ters eğik çizgi geçer. Bu değiştirme dizede çift ters bölü kullanmanız gerekir aynı nedenle "\\1".

Uygulamaya bağlı olarak, aynı zamanda giriş $string herhangi bir <em> etiketler içermiyorsa olasılığını dikkate almak isteyebilirsiniz. Bu durumda, yukarıdaki ifadeler size niyetinde değil muhtemelen boş bir dize neden olacaktır.

Sizin için normal ifade kullandığınız tüm html etiketlerini kaldırmak için ise, belki PHP'nin strip_tags () fonksiyonu daha uygun olurdu.

php.net manual entry

ereg_replace kelime sınır iddiasını (\ b) veya non-açgözlü değiştirici (*?) desteklemiyor. Pez doğru, muhtemelen gebelik kullanıyor olmalıdır.

preg_replace('!<em\\b[^>]*>(.*?)</em>!', '$1', $string)

PHP \ b yerine geçmez, çünkü ekstra ters eğik kesinlikle gerekli değildir, ama her zaman bir dize Ters eğik çizgi kaçmak için iyi bir fikirdir.

Bu ereg gelecekte uyumluluk için önlemek için muhtemelen iyi bir fikir. O this göre PHP6 amortismana tabi olmuş gibi görünüyor.

Taşınabilir İşletim Sistemi Arabirimi (POSIX) düzenli ifadeleri destekler ereg uzantısı, çekirdek PHP desteği kaldırılıyor.

<em> etiketleri kaldırma niyeti ise, ben şu tavsiye ederim:

<?php
  $string = 'Feugiat <em>hendrerit</em> sit iriuredolor aliquam.';
  $string = ereg_replace("</?em\\b[^>]*>", "", $string);
  echo $string;
?>

Greg Hewgill PHP dize tersbölülerden kaçan hakkında doğru. Eğer regex desen dizeye literal ters eğik çizgi almak için bunu yapmamız gerekiyor.

Ben ereg_ anlaşılır ve her zaman gebelik kullanmak asla. Greg anlaşılacağı gibi ters eğik çizgi ekleyin ve preg_ değiştirmek eğer derlemek olacaktır.

$string = preg_replace('%<em\\b[^>]*>(.*?)</em>%','\\1',$string);

Düzenleme: Ben özellikle bu yaklaşım sorun için ideal olmayabilir burada başkaları ile katılıyorum. Ama yine de, preg_ en sık PHP Regexes kullanırken gitmek için yoludur.

Greg Hewgill cevabı doğru ilk görünüyordu ama ben denemek ve o cevap bu kodu kullandığınızda:

<?php 
$string = 'Feugiat <em>hendrerit</em> sit iriuredolor aliquam.';
$string = ereg_replace("<em\\b[^>]*>(.*?)</em>","\\1",$string);
echo $string;
?>

Ben bu hatayı alıyorum:

Warning: ereg_replace() [function.ereg-replace]: REG_BADRPT in test.php on line 3

Yani ereg model henüz çalışmak için görünmüyor.