Olmayan alphanum tekrarlama ile bir dize sterilize

3 Cevap php

(Yaratıcı), kullanıcıların bazı sivil alphanum tekrarı ile "dikkat çekmek" denediğimde makale başlıkları sterilize etmek gerekir.

Exemples:

  • Benim ürünü satın!!!!!!!!
  • Benim ürünü satın!? !? !? !? !? !?
  • Benim ürünü satın!!! .......!!!
  • <----------- Benim ürünü satın

Bazı olarak kabul edilebilir bir çözelti, 2-olmayan alphanum tekrarını azaltmak olacaktır.

Yani alacağı:

  • Benim ürünü satın!
  • Benim ürünü satın!? !?
  • Benim ürünü satın!..!!

Bu çözüm, bu işe yaramadı:

preg_replace('/(\W{2,})(?=\1+)/', '', $title)

Nasıl regex PHP ile bunu yapmak için herhangi bir fikir?

Diğer iyi bir çözüm de (onlar mantıklı gibi tüm olmayan alphanum karakterler şerit olamaz) karşılandı.

Edit: nesnel en yaygın sorunları önlemek için sadece. Diğer yaratıcı durumlarda elle temizlenmiş veya başka bir regex ile dezenfekte edilecektir.

3 Cevap

Bu tekrarlanan ifade keyfi büyük, özellikle eğer gerçekten bir regex ile çözmek için verimsiz bir sorun. Pratik olarak, sadece 3-5 gibi bir şey tekrarlanan ifade uzunluğunu kapağı için yeterli shold, ve çok daha kolay olmalıdır.

Gibi bir şey

$title = preg_replace('/(\W{1,5})(?=\1+)/', '', $title);

çalışması gerekir.

Bazı ön test gösteriyor ki

$title = 'Buy my product !!!!!!!!!!!!!!!!!!!!!!!! Buy my product !? !? !? !? !? !? Buy my product !!!!!!!!!.......!!!!!!!! Buy my product <-----------';

$title = preg_replace('/(\W{1,5})(?=\1{2,})/', '', $title);

echo $title;

çıktısı

Buy my product !! Buy my product !? !? Buy my product !!..!! Buy my product <--

Bu, tüm test durumları geçmek için görünür.


Re: Gordon

Sizin dize:

¸·´`·¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺

İlk bölümde iki katından daha fazla bir şey ama tekrar etmez. Bu gerektirecek gibi görünüyor:

$title = preg_replace('/(\W{1,9})(?=\1{2,})/', '', $title);

o kadar kolaylaştırır önce

¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺

(- Oh iyi Hangi preg_replace Unicode farkında olmadığını ima)

Ayrıca sadece bir kez tekrarlamak için ayarlayabilirsiniz:

$title = preg_replace('/(\W{1,9})(?=\1+)/', '', $title);

bir hale gelir ki bu durumda:

¸·´`·¸ Human ·-> creativity < is endless !¡! ☻☺

Puanınızı o az iki kez tekrarlamak için gerekli olsa bile "ASCII sanatı" birçok oluşturmak mümkün olduğunu ise, iyi, dışarıdaki bu sorunun kapsamı bulunuyor. Minimumda ASCII sanatı tutma amaçları için, ben gibi bir şey kullanarak sadece öneriyoruz:

preg_replace('/(\W{5})\W+/', '$1', $title);

(Yani sadece bir satırda görüntülenebilir alfasayısal olmayan karakter sayısını kap., Bu Rusya gibi, non-Latin alfabelerinde dilleri ile uyumluluk için ayarlanması gerekir unutmayın.)

Ben biraz farklı bir cevabım var

if (preg_match('/^[^\da-z\s_-]$/i', $str)) {

  // auto post, but flag to moderator to inspect title OR
  // instead of auto posting, put in 'waiting to be authorised' by a mod

}

Ben bu regex doğru olduğunu umuyorum, ama ben henüz denemedim. Birisi 0-9 değil kendi başlık karakter, AZ (harf duyarsız), boşluk, çizgi ve çizgi olduğunda temelde algılamak gerekir. Tabii ki, sizin beğeninize göre bu değiştirebilirsiniz.

Ayrıca son kullanıcıyı bilgilendirmek için iyi bir fikir olurdu

"Titles that deliberately try to attract attention without benefiting the product description may be deleted without warning"

Olmayan açgözlü aramayı kullanın?

preg_replace('/(\W{2,}?)(?=\1+)/', '', '{{your data}}');

sonucudur

  * Buy my product !!
  * Buy my product !?
  * Buy my product !!!...!!
  * Buy my product <---