Zaten kodlanmış ve işaretleri uyan Bu regex ile tüm tuzaklar

6 Cevap php

PHP, zaten kodlanmış henüz ve işaretleri kodlamak istiyorum. Ben bu regex ile geldi

/&(?=[^a])/

O kadar iyi bir iş gibi görünüyor, ancak herhangi bir potansiyel tuzaklar bu regex görülebilir eğer ben bir regex uzman sayılmam ne gibi görerek, ben soruyorum?

Esasen & & dönüştürmek ancak (böylece ([{elde değil gibi & & bırakmak gerekiyor 4 )]})

Teşekkürler

Update

Teşekkürler for the answers. It seems I wasn't thinking broadly enough to cover all bases. This seems like a common pitfall of regexs themselves (having to think of all possibilities which may make your regex get false positives). It sure does beat my original one str_replace(' & ', ' & ', $string); :)

6 Cevap

Daha iyi negative lookahead assertion doğrulamak & olacaktır amp ile takip değil;

/&(?!amp;)/

O other kişiler için kullanılan herhangi bir VE işareti değişecek olsa. Başkalarına olması muhtemeldir iseniz, o zaman nasıl gibi bir şey hakkında

/&(?!#?[a-z0-9]+;)/

Bu bir ve işareti aramak, ancak (sayısal varlık için) isteğe bağlı bir karma sembolü takip DEĞİLDİR ileri sürerek alphanumerics, bir dizi ve named and numeric entities gibi kapsamalıdır bir noktalı virgül, olacak {[(1)] } veya ª

Test code

$text="It’s 30 ° outside & very hot. T-shirt & shorts needed!";

$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);

echo "$text\n";

Hangi çıktısı

It’s 30 ° outside & very hot. T-shirt & shorts needed!

daha kolay "It’s 30 ° outside & very hot. T-shirt & shorts needed!" olarak okunduğu

Alternative for PHP 5.2.3+

Ionut G. Stan aşağıda belirttiği gibi, PHP, örn false çift kodlama önlemek için dördüncü bir parametre ile htmlspecialchars kullanabilirsiniz 5.2.3

$text=htmlspecialchars($text,ENT_COMPAT,"UTF-8",false);

Bu başka bir kodlanmış karakter için geçerli olacaktır.

PHP sürümü ise> = size htmlspecialchars fonksiyonunun dördüncü parametre kullanabilirsiniz 5.2.3. False olarak ayarlandığında bu mevcut varlıkları dönüştürmek değildir.

Perl olurdu:

$content =~ s/&(?!\w+;)/&/g;

Bu "bir veya daha fazla kelime karakter tarafından takip ve hemen bir noktalı virgül takip edilmezse bir işareti, yani 1 veya daha fazla sözcük karakter olumsuz lookahead kullanır. Kullanımı kısayol \ w için belirli bir karakter aralığı olarak güvenli değildir os rağmen ., bu özel durumda daha iyi bir seçenek olacaktır:

$content =~ s/&(?![a-z]+;)/&/g;

Ve sadece durumda size veri bazı büyük hayvan var:

$content =~ s/&(?![a-zA-Z]+;)/&/g;

Eğer belgedeki diğer varlıkları varsa ne olur? Ne bir Q & A oturumunda bahsediyoruz eğer olur?

Ben işareti izole ziyade bağlamda tahmin, ve sonra değiştirme dizede geribaşvuruları kullanmak istiyorum

/(\W)&(\W)/$1&$2/

Bu karakter 'bir' bir işareti şöyle bir durumda başarısız değildi ama istiyorum "amp;" gibi aynı zamanda & Elma & ve & ...

& (?! Amp ;)