2009-07-13 10 views
1

J'ai un champ de balise dans ma page Web, dans lequel l'utilisateur peut entrer des balises les séparant par , (virgule), même chose que dans StackOverflow. J'utilise PHP et je sépare tous les balises enetered par l'utilisateur sur la base de la virgule en utilisant la fonction exploser, puis en les ajoutant à ma table de balises dans la base de données.Comment saisir les tags correctement?

Mon code fonctionne parfaitement pour les balises normales comme si l'utilisateur est entré battleship, strategy, sea war alors son travail, mais permet de dire que l'utilisateur enetered battleship, strategy, sea war, ou battleship, strategy, games, sea war, , , , , ou ou d'une mauvaise valeur, alors comment vais-je détecter puis entrez seulement le péché de la valeur correcte de la base de données.

Est-il possible d'utiliser regExp ou d'une autre manière, s'il vous plaît dites-moi comment?

+1

balises arn't séparés par des virgules dans StackOverflow, sont-ils? Pensé que c'était des espaces ... – Svish

+0

Oui, ils sont séparés par des espaces. – Prashant

Répondre

7
$tags = "battleship, stragety, ,"; 

$exp = explode(",", $tags); 

$valid_tags = array(); 

foreach($exp as $tag) 
{ 
if(($tag = trim($tag)) != "") 
{ 
    $valid_tags[] = $tag; 
} 
} 

supprimera les espaces de toute étiquette et si elle a un texte, l'étiquette sera ajoutée dans un tableau valide :)

1

Vous pouvez utiliser des expressions régulières pour diviser la chaîne dans les balises, par exemple:

\s*,\s* 

$tags = preg_split('/\\s*,\\s*/', $str); 
$tags = array_filter(array_map('trim', $tags)); 
var_dump($tags); 

Mais vous devez toujours vérifier si les balises sont valides. Une balise vide par exemple (comme dans foo,,bar) ne l'est pas. Il suffit de les filtrer et de passer le reste à votre base de données.

ou vous utilisez une expression régulière pour trouver simplement des balises valides:

\w+(?:\s+\w+)* 

preg_match_all('/\\w+(?:\\s+\\w+)*/', $str, $tags, PREG_PATTERN_ORDER); 
var_dump($tags); 
+0

Je pense que c'est la raison pour laquelle le SO utilise des espaces pour séparer les balises, parce que si quelqu'un entre des espaces doubles ou des espaces uniques dans le dernier, alors nous pouvons le découper facilement. ? – Prashant

+0

Vous pouvez le faire avec des virgules et des espaces: 'trim ($ str, ',')'. – Gumbo

0

Une meilleure façon est de proposer des utilisateurs ce que les étiquettes qu'ils peuvent ajouter - facile, vous pouvez le faire whit jquery ajax :) Certains pensent comme here (ajaxdaddy.com)

1

Pas besoin de RegExps dans ce cas. explode délivre les extraits de tag, et trim supprime les espaces blancs. Vérifiez juste s'il reste quelque chose.

$tags = explode (",", $posted_tags); 
foreach ($tags as $tag) { 
    if ($value = trim ($tag)) { 
     insert_into_db ($value); 
    } 
} 

Cheers,

1
$str = "ship,, , , , ,water"; 

$tags = explode(',', $str); 

foreach($tags as $tag) { 
    if($tag) { 
     echo trim($tag) ; 
    } 
} 
+2

vous voudrez peut-être couper les balises avant d'insérer, au cas où quelqu'un entre "navire, bataille, navale" –

+0

Merci kuroki. J'ai édité. – sqram

+0

Je ne suis pas tout à fait sûr, ce que fait le isset(). $ tag est défini de toute façon, même s'il s'agit de la chaîne vide. – Boldewyn

0

Vous pouvez probablement sortir avec la très succincte:

$tags = array_filter(explode(',', $str));

depuis (du manuel pour array_filter):

Si aucun rappel n'est fourni, toutes les entrées d'entrée égales à FALSE (voir conversion en booléen) seront supprimées.

(C'est si ça ne vous dérange pas de rejeter « 0 », et d'autres valeurs évaluées à FALSE)