Comment entrer des tags correctement?
Question
J'ai un champ de balise dans ma page web, dans lequel l'utilisateur peut entrer des tags les seprating par ,
(virgule), même comme cela se fait dans StackOverflow. J'utilise PHP et je suis seprating tous les tags enetered par l'utilisateur sur la base de la fonction virgule à l'aide puis explosera et les ajouter à ma table de balises dans Teh base de données.
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 battleship, strategy, games,, sea war
ou 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 à l'aide d'expressions rationnelles ou de toute autre manière, s'il vous plaît me dire comment?
La solution
$tags = "battleship, stragety, ,";
$exp = explode(",", $tags);
$valid_tags = array();
foreach($exp as $tag)
{
if( ($tag = trim($tag)) != "")
{
$valid_tags[] = $tag;
}
}
supprime les espaces de toute étiquette et si elle a un texte, balise sera ajoutée dans un tableau valide:)
Autres conseils
Pas besoin de regExps dans ce cas. explode
fournit des extraits d'étiquette et trim
supprime les espaces blancs. Il suffit de vérifier, si quelque chose est alors à gauche.
$tags = explode (",", $posted_tags);
foreach ($tags as $tag) {
if ($value = trim ($tag)) {
insert_into_db ($value);
}
}
Cheers,
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 alors vous devez toujours vérifier si les balises sont valides. Une balise vide par exemple (comme dans foo,,bar
) n'est pas. filtrez simplement les et passer le reste à la 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);
$str = "ship,, , , , ,water";
$tags = explode(',', $str);
foreach($tags as $tag) {
if( $tag ) {
echo trim($tag) ;
}
}
Vous pouvez probablement en tirer avec la très succincte:
$tags = array_filter(explode(',', $str));
depuis (du manuel array_filter
):
Si aucun rappel est fourni, toutes les entrées d'entrée égale à FALSE (voir la conversion en booléen) seront supprimés.
(C'est si ça ne vous dérange pas de rejeter « 0 », et d'autres valeurs évaluées à FALSE)