Question

Je veux que le type d'utilisateur dans les balises:

windows linux "mac os x"

et puis les séparer par des espaces, mais en reconnaissant « mac os x » comme un mot entier.

Est-ce possible de combiner la fonction d'exploser avec d'autres fonctions pour cela?

Il doit y avoir un moyen.

Était-ce utile?

La solution

Tant qu'il ne peut y avoir des citations entre guillemets (par exemple. "foo\"bar" est pas autorisé), vous pouvez le faire avec une expression régulière. Sinon, vous avez besoin d'un analyseur complet.

Cela devrait faire:

function split_words($input) {
  $matches = array();
  if (preg_match_all('/("([^"]+)")|(\w+)/', $input, $reg)) {
    for ($ii=0,$cc=count($reg[0]); $ii < $cc; ++$ii) {
      $matches[] = $reg[2][$ii] ? $reg[2][$ii] : $reg[3][$ii];
    }
  }
  return $matches;
}

Utilisation:

$input = 'windows linux "mac os x"';
var_dump(split_words($input));

Autres conseils

Je demande à l'utilisateur d'entrer les balises virgules séparés et exploser avec delimiter virgule:

$string = "windows, linux, mac os x";
$pieces = explode(',', $string);

Ceci est leur façon la plupart des travaux du système de balise de toute façon.

sinon vous devrez construire un analyseur, car exploser ne peut pas faire face à ce que vous voulez. Regex est un surpuissant à mon avis.

Soit que l'utilisateur séparer leurs valeurs de balise avec des virgules comme Elzo Valugi suggéré, ou d'améliorer votre interface utilisateur afin que les utilisateurs entrent dans une étiquette à la fois (similaire à Google Wave ou l'interface utilisateur de marquage de Wordpress). Je suggère que le plus tard.

Si vous voulez vraiment coller avec votre format d'entrée proposé (que je ne suggère pas), vous pouvez maintenir une liste des balises à plusieurs mots (ceux qui ne sont pas censés être divisé). Comparer la chaîne de l'étiquette combinée fournie par l'utilisateur contre cette liste et assurez-vous que vous ne divisez pas ces termes. Si vous définissez le coller à cette méthode, je pourrais entrer dans les détails plus, mais je ne pense pas que ce soit une bonne idée que le format d'entrée lui-même est défectueux.

Vous pouvez faire une expression régulière. Je ne suis pas le meilleur à les écrire, mais quelqu'un d'autre ici devrait être en mesure de faire correspondre les « mots » qui se brisent sur les espaces qui ne sont pas entre guillemets.

Lorsque l'utilisateur entre dans la chaîne "mac os x" vous pouvez détecter automatiquement l'espace blanc et changer en chaîne pour "mac-os-x" alors vous pouvez encore exploser cette façon:

$os = "metasys solaris mac-os-x";
$strings = explode(' ', $os);

Vous pouvez le faire en utilisant le remplacer fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top