2009-02-10 21 views
5

En mi aplicación php, el usuario puede ingresar las etiquetas (como aquí mientras hace la pregunta). Supongo que será regexp, y usé uno - mb_split ('\ W +', $ text) - para dividir por caracteres que no sean de palabra.mejor manera de crear/dividir cadena en etiquetas

Pero quiero permitir que los usuarios ingresen caracteres como "-, _, +, #" etc. que son válidos para estar en url y son comunes.

¿Hay soluciones existentes para esto, o pueden ser las mejores prácticas?

gracias.

Respuesta

23

Utilice la función explode() y sepárela por espacios o comas. Ejemplo:

$string = 'tag1 tag-2 tag#3'; 
$tags = explode(' ', $string); //Tags will be an array 
+0

¿qué es el usuario ingresará "?" ¿personaje? se romperá url – waney

+0

No debería romper la url. – VirtuosiMedia

+0

No se olvide de urlencode() CUALQUIER entrada de usuario. Esto evitará '#' y '?' de romper la URL. – matpie

9

Dividir por el espacio en blanco \s+ en su lugar.

3

Dividir en \ s + (espacio en blanco) en lugar de \ W + (no alfanumérico).

2

supongo que se podría primero tratar de limpiar la cadena antes de su división en tags:

# List characters that you would want to exclude from your tags and clean the string 
$exclude = array('/[?&\/]/', '/\s+/'); 
$replacements = array('', ' '); 
$tags = preg_replace($exclude, $replacements, $tags); 

# Now split: 
$tagsArray = explode(' ', $tags); 

Probablemente se podría adoptar un enfoque de lista blanca para esto también, y más bien tienen caracteres usted acepta listado en su patrón.

2

Dijiste que querías que funcionara como el etiquetador stackoverflow. Este etiquetador los divide por el carácter en blanco "".

Si lo desea, puede ser su comportamiento, así, basta con utilizar:

mb_split('\s+', $text) 

en lugar de:

mb_split('\W+', $text) 

Buena suerte!

0

Use preg_match_all.

$tags = array(); 
if(preg_match_all('/\s*(.*)\s*/U',$tags)) unset($tags[0]); 
//now in $tags you have an array of tags. 

si las etiquetas están en UTF-8, añada u modificador de la expresión regular.

1

utilizo esta función() smart_explode para analizar las etiquetas en mi aplicación:

function smart_explode ($exploder, $string, $sort = '') { 
    if (trim ($string) != '') { 
    $string = explode ($exploder, $string); 
    foreach ($string as $i => $k) { 
     $string[$i] = trim ($k); 
     if ($k == '') unset ($string[$i]); 
    } 
    $u = array_unique ($string); 
    if ('sort' == $sort) sort ($u); 
    return $u; 
    } else { 
    return array(); 
    } 
} 

explota una cadena $ en una matriz mediante el uso de $ detonador como un separador (por lo general una coma), elimina el duplicado, recorta los espacios alrededor de las etiquetas e incluso ordena las etiquetas si $ sort es 'ordenar'. Devolverá una matriz vacía cuando no haya nada dentro de $ string.

El uso es como:

$mytaglist = smart_explode (',', ' PHP, ,,regEx ,PHP'); 

El anterior devolverá:

array ('PHP', 'regEx') 

Para filtrar los caracteres que no le gusta, hacer un

$mytaglist = str_replace (array ('?', '$', '%'), '_', $mytaglist); 

antes smart_exploding (listando los caracteres "malos" en la matriz para reemplazarlos por un guión bajo).

1

El enfoque correcto para el manejo de las etiquetas depende de sus preferencias de entrada de tratamiento: Usted puede eliminar las etiquetas no válidas en su totalidad, o tratar de limpiar las etiquetas para que sean válidos.

enfoque de lista blanca para definir caracteres válidos se debe utilizar en la limpieza de la entrada - no hay simplemente demasiados caracteres problemáticos a la lista negra.

mb_internal_encoding('utf8'); 

$tags= 'to# do!"¤ fix-this str&ing'; 
$allowedLetters='\w'; 
// Note that the hyphen must be first or last in a character class pattern, 
// to match hyphens, instead of specifying a character set range 
$allowedSpecials='_+#-'; 

El primer enfoque elimina las etiquetas no válidas en su totalidad:

// The first way: Ignoring invalid tags 

$tagArray = mb_split(' ', $tags); 

$pattern = '^[' . $allowedLetters . $allowedSpecials . ']+$'; 

$validTags = array(); 
foreach($tagArray as $tag) 
{ 
    $tag = trim($tag); 
    $isValid = mb_ereg_match($pattern, $tag); 
    if ($isValid) 
     $validTags[] = $tag; 
} 

El segundo enfoque intenta limpiar las etiquetas:

// The second way: Cleaning up the tag input 

// Remove non-whitelisted characters 
$pattern = '[^' . $allowedLetters . $allowedSpecials .']'; 

$cleanTags = mb_ereg_replace($pattern, ' ', $tags); 

// Trim multiple white spaces. 
$pattern = '\s+'; 
$cleanTags = mb_ereg_replace($pattern, ' ', $cleanTags); 

$tags = mb_split(' ',$cleanTags); 

Sustitución de caracteres no válidos con espacios en blanco conduce a problemas veces - para ejemplo, el anterior "str & ing" se convierte en "str ing". Eliminar completamente los caracteres ilegales daría como resultado "cadena", que es más útil en algunos casos.

Cuestiones relacionadas