2010-03-28 11 views
5

Ho bisogno di disinfettare i titoli degli articoli quando gli utenti (creativi) cercano di "attirare l'attenzione" con alcune ripetizioni non alfanumiche.Sanitizza una stringa con ripetizione non alphaum

Esempi:

  • acquistare il mio prodotto !!!!!!!!!!!!!!!!!!!!!!!!
  • Acquista il mio prodotto !? !? !? !? !? !?
  • Acquista il mio prodotto !!!!!!!!! ....... !!!!!!!!
  • comprare il mio prodotto < -----------

Alcuni soluzione accettabile sarebbe quello di ridurre la ripetizione della non alphanum a 2.

Quindi vorrei arrivare:

  • Acquista il mio prodotto !!
  • Acquista il mio prodotto !? !?
  • Acquista il mio prodotto !! .. !!
  • comprare il mio prodotto < -

Questa soluzione non ha funzionato molto bene:

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

Qualsiasi idea di come farlo in PHP con regex?

Un'altra soluzione migliore è anche benvenuta (non posso escludere tutti i caratteri non alfanumerici come possono avere senso).

Modifica: l'obiettivo è solo quello di evitare problemi più comuni. Gli altri casi creativi verranno disinfettati manualmente o sterilizzati con un'altra espressione regolare.

+7

¸ ·'' · ¸ ·'' · ¸ ·'' · ¸ Umano · -> creatività << è infinita! ¡! ¡! ☻☺ – Gordon

+2

Digitare cazzate in descrizioni non include solo punti esclamativi, ma anche titoli come "Acquista prodotto Mu". Immagino che questo tipo di cose non possano essere verificate con una espressione regolare, ed è meglio in qualche modo modificare/controllare i titoli da parte di editor e/o community per filtrare quelli senza significato. – che

risposta

2

Questo è davvero un problema inefficiente da risolvere con un'espressione regolare, soprattutto se l'espressione ripetuta è arbitrariamente grande. In pratica, è sufficiente limitare la lunghezza dell'espressione ripetuta a qualcosa come da 3 a 5, e dovrebbe essere molto più semplice.

Qualcosa di simile

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

dovrebbe funzionare.

alcuni test preliminari dimostrano che

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

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

echo $title; 

uscita volontà

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

Questo sembra passare tutti i casi di test.


Re: Gordon

La stringa:

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

non ripete altro che la prima parte più di due volte.E sembra richiedere:

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

prima che semplifica al

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

(il che implica che preg_replace non è Unicode-aware - vabbè)

è anche possibile regolare a ripetere una volta:

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

nel qual caso diventa:

012.

Se il vostro punto è che è possibile creare un sacco di "arte ASCII" anche se è necessario ripetere meno di due volte, beh, questo è al di fuori dello scopo di questa domanda. Ai fini del mantenimento arte ASCII al minimo, mi sento di raccomandare semplicemente usando qualcosa come:

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

(vale a dire solo limitare il numero di caratteri non alfanumerici che possono essere visualizzati in una fila Si noti che questo avrebbe bisogno. da regolare per la compatibilità con le lingue con alfabeti non latini, come il russo.)

+0

@Gordon Ho modificato la mia risposta; la nuova versione passa tutte le stringhe nella domanda. – Zarel

+0

@Zarel Prova con la stringa che ho dato nel ** commento ** alla domanda per favore. – Gordon

+0

Inoltre: se si vuole veramente ridurre "ASCII-art" nei titoli, è sufficiente fare qualcosa come 'preg_replace ('/ (\ W {5}) \ W + /', '$ 1', $ title); '(cioè basta limitare il numero di caratteri non alfanumerici che possono essere visualizzati in una riga. Si noti che questo potrebbe causare problemi con lingue con alfabeti non latini, come il russo.) – Zarel

0

Utilizzare una ricerca non ingorda?

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

risultato è

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

non funziona :( – Toto

+0

@Toto: strano, funziona per me. Controlla se il codice PHP completo aggiornato aiuta. – kennytm

1

Ho una risposta che è un po 'diverso

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 

} 

Spero di avere che regex corretta, ma non l'ho provato. Fondamentalmente dovrebbe rilevare quando qualcuno ha nei caratteri del titolo che non sono 0-9, A-Z (maiuscole e minuscole), spazio bianco, trattino basso e trattino. Naturalmente, puoi modificarlo in base alle tue preferenze.

sarebbe anche una buona idea per informare l'utente finale

"Titoli che deliberatamente cercano di attirare l'attenzione senza beneficiare la descrizione del prodotto potrebbero essere cancellati senza avvertimento"

Problemi correlati