2010-03-28 19 views
5

Necesito desinfectar los títulos de los artículos cuando los usuarios (creativos) intentan "llamar la atención" con alguna repetición que no sea alfanumérica.Sanitize una cadena con repetición no alfanumérica

Exemples:

  • comprar mi producto !!!!!!!!!!!!!!!!!!!!!!!!
  • Comprar mi producto!? ! ! ! ! !
  • Comprar mi producto !!!!!!!!! ....... !!!!!!!!
  • comprar mi producto < -----------

Algunos solución aceptable sería reducir la repetición de la no ALPHANUM a 2.

Así que me gustaría tener:

  • Comprar mi producto !!
  • Comprar mi producto!? !
  • Comprar mi producto !! .. !!
  • comprar mi producto < -

Esta solución no funcionó tan bien:

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

alguna idea de cómo hacerlo en PHP con expresiones regulares?

Otra mejor solución también es bienvenida (no puedo quitar todos los caracteres que no sean alfanuméricos ya que pueden tener sentido).

Editar: el objetivo es evitar la mayoría de los problemas comunes. Los otros casos creativos se desinfectarán manualmente o se desinfectarán con otra expresión regular.

+7

¸ · '' · ¸ · '· · ¸ ·' · · ¸ Humano · -> creatividad ¡¡¡es infinito !! ¡! ¡! ☻☺ – Gordon

+2

Escribir torpes descripciones no incluye solo signos de exclamación, sino también títulos como "Comprar producto mu". Supongo que este tipo de cosas no pueden ser verificadas con una expresión regular, y es mejor editar/verificar los títulos de algún modo por los editores y/o la comunidad para filtrar los que no tienen significado. – che

Respuesta

2

Eso es realmente un problema ineficiente para resolver con una expresión regular, especialmente si la expresión repetida es arbitrariamente grande. Prácticamente, debe ser suficiente para limitar la longitud de la expresión repetida en algo así como 3 a 5, y debería ser mucho más fácil.

Algo así como

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

debería funcionar.

Algunas pruebas preliminares muestran que

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

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

echo $title; 

es la salida

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

Esto parece pasar todos los casos de prueba.


Re: Gordon

su cadena:

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

no se repite todo menos la primera parte de más de dos veces.Se parece requerir:

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

antes de que se simplifica a

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

(lo que implica que no es preg_replace compatibles con Unicode - oh bien)

también se puede ajustar para repetir solamente una vez:

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

en cuyo caso se convierte en:

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

Si su punto es que es posible crear gran cantidad de "arte ASCII" incluso si se requiere repetir menos de dos veces, bueno, eso está fuera del alcance de esta pregunta. A los efectos de mantener el arte ASCII a un mínimo, recomendaría simplemente usando algo como:

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

(es decir, justo limitar el número de caracteres que no sean alfanuméricos que se pueden mostrar en una fila Tenga en cuenta que esto tendría. para ajustar por compatibilidad con idiomas con alfabetos no latinos, como el ruso.)

+0

@Gordon He editado mi respuesta; la nueva versión pasa todas las cadenas en la pregunta. – Zarel

+0

@Zarel Pruebe con la cadena que di en el ** comentario ** a la pregunta, por favor. – Gordon

+0

También: si realmente quiere reducir "ASCII-art" en títulos, es suficiente hacer algo como 'preg_replace ('/ (\ W {5}) \ W + /', '$ 1', $ title); '(es decir, limitar el número de caracteres no alfanuméricos que se pueden mostrar en una fila. Tenga en cuenta que esto podría causar problemas con idiomas con alfabetos no latinos, como el ruso.) – Zarel

0

¿Utiliza la búsqueda no codiciosa?

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

resultado es

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

no funciona :( – Toto

+0

@Toto: extraño, funciona para mí. Vea si el código PHP completo actualizado ayuda. – kennytm

1

tengo una respuesta que es un poco diferente

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 

} 

espero tener que expresiones regulares correcta, pero no he probado. Básicamente debe detectar cuando alguien tiene en sus personajes del título que no son 0-9, A-Z (sin distinción entre mayúsculas y minúsculas), espacios en blanco, guiones bajos y guiones. Por supuesto, puede modificar esto para adaptarlo a su gusto.

También sería una buena idea para informar al usuario final

"Títulos que tratan deliberadamente de atraer la atención sin beneficiar la descripción del producto puede ser eliminado sin advertencia"

Cuestiones relacionadas