2009-02-10 13 views
5

Nella mia applicazione php utente in grado di inserire i tag (come qui mentre si fa una domanda). Suppongo che sarà regexp, e ho usato uno - mb_split ('\ W +', $ text) - per dividere per caratteri non di parole.il modo migliore per creare/dividere la stringa sui tag

Ma voglio consentire agli utenti di immettere caratteri come "-, _, +, #" ecc. Che sono validi per essere in url e sono comuni.

Esistono soluzioni per questo o potrebbero essere le migliori pratiche?

grazie.

risposta

23

Utilizzare la funzione explode() e separare con spazi o virgole. Esempio:

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

cosa viene inserito dall'utente "?" carattere? si romperà l'url – waney

+0

Non dovrebbe rompere l'url. – VirtuosiMedia

+0

Non dimenticare di urlencode() QUALSIASI input utente. Questo impedirà '#' e '?' da rompere l'URL. – matpie

9

Diviso invece per gli spazi bianchi \s+.

3

Diviso su \ s + (spazio bianco anziché \ W + (non alfanumerico).

2

suppongo che si possa provare prima di ripulire la stringa prima di sciogliersi in tag:

# 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); 

Probabilmente si potrebbe adottare un approccio lista bianca per questo pure, e preferisce avere caratteri accetti elencato nel tuo modello.

2

Hai detto che volevi che funzionasse come il tagger di stackoverflow. Questo tagger li divide dal carattere dello spazio bianco "".

Se vuoi questo per essere il vostro comportamento così, è sufficiente utilizzare:

mb_split('\s+', $text) 

invece di:

mb_split('\W+', $text) 

Buona fortuna!

0

Utilizzare 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. 

se i tag sono in UTF-8, aggiungi u modificatore alla regexp.

1

Io uso questa funzione() smart_explode per analizzare i tag nella mia app:

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(); 
    } 
} 

esplode una stringa $ in un array utilizzando $ esploditore come separatore (di solito una virgola), rimuove il duplicato, taglia gli spazi attorno ai tag e persino ordina i tag per te se $ sort è 'sort'. Restituirà un array vuoto quando nulla è all'interno della stringa $.

L'utilizzo è simile:

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

È possibile che questo tornerà:

array ('PHP', 'regEx') 

Per filtrare i caratteri che non ti piace, fare un

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

prima smart_exploding (elencando i caratteri "cattivi" nella matrice per essere sostituiti con un carattere di sottolineatura).

1

L'approccio corretto alla gestione dei tag dipende dalle preferenze sull'elaborazione dell'input: è possibile rimuovere completamente i tag non validi oppure provare e pulire i tag in modo che diventino validi.

L'approccio whitelist alla definizione di caratteri validi deve essere utilizzato per la pulizia dell'input: ci sono semplicemente troppi caratteri problematici nella lista nera.

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='_+#-'; 

Il primo approccio elimina i tag non validi del tutto:

// 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; 
} 

Il secondo approccio cerca di pulire i tag:

// 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); 

Sostituzione caratteri non validi con spazi bianchi porta a problemi a volte - per esempio il precedente "str & ing" viene convertito in "string". Rimuovere completamente i caratteri non validi risulterebbe in "stringa", che in alcuni casi è più utile in .

Problemi correlati