-1
votes

Correspondre aux chaînes données dans une chaîne et sortie un tableau

Disons que j'ai une corde comme

"Étudiant - John Doe a mangé des pommes" p>

"Étudiant - Bob a mangé des oranges" p> blockQuote>

Je sais que cette phrase se compose de: ": Type -: qui a mangé: nom code> p>

est un moyen d'obtenir une gamme d'actions, en utilisant les deux Strings telles que: P>

$arr = [
   "type" => "Student",
   "who" => "John Doe",
   "noun" => "apples"
];

$arr2 = [
   "type" => "Student"
   "who" => "Bob",
   "noun" => "oranges"
];


8 commentaires

Si vous connaissez les actions et que le nom sera toujours des mots simples, vous pouvez le faire. Sinon, il n'ya pas vraiment de moyen de dire quel mot se passe avec quelle partie à moins que votre application comprend comment l'anglais fonctionne, qui est beaucoup plus compliquée que de tirer le texte d'une chaîne.


@ Sickpanic j'ai simplifié les chaînes. Je sais que le nom est un mot "mangé" est statique. Seulement "qui" peut être 1 ou 2 mots. Le reste est que je sais avec certitude qu'ils sont 1 mot. Maintenant est-ce possible?


Pourquoi un -1 et marquer aussi près? C'est une question totalement logique et réalisable par programme. Au moins donner une raison pourquoi.


Ce n'était pas moi, si vous m'adressez à moi. Je pense avec le format plus cohérent après votre édition, c'est certainement possible.


Non, ce n'était pas pour toi sûrement.


@sez-vous, je n'ai pas abouti, mais c'est probablement parce que vous ne montrez aucune preuve d'essayer de le résoudre vous-même. Donc, ce n'est pas un service de codage libre.


Vous pouvez essayer de transformer votre modèle en une expression régulière. Mais les expressions régulières sont assez limitées. Ce n'est donc pas un bon moyen de réaliser un réel traitement de langue naturelle, qui nécessite une analyse sophistiquée.


@Barmar Oui, je sais absolument. Mais, contrairement à la réponse donnée, je voulais connaître un type de solution d'expression régulier. J'apprécierais très bien si vous pouvez donner un exemple. Je n'essaie pas de réaliser des chaînes de langues complexes - ce ne sont que des phrases robotiques et je connais des valeurs possibles de la chaîne.


3 Réponses :


1
votes

Ceci peut effectivement être fait sans regex si vous avez vraiment les règles strictes données dans votre question mise à jour. First Split par le tableau de bord pour obtenir le type, puis diviser le reste par "mangé" pour obtenir la personne et le nom. xxx

Démo


3 commentaires

J'ai de nombreux types et ce n'est qu'un type. J'apprécierais aussi que vous puissiez ajouter le type de solution de regex.


@sez-vous par "TYPE", voulez-vous dire la partie "étudiant"? Si tel est le cas, cela fonctionnera pour tout "type", tant qu'il précède le tiret, comme vous l'avez indiqué. De plus, Regex a des frais généraux importants et est souvent survenue pour des situations simples.


Oui. Merci de me donner une approche cependant. Je bricolerais de voir laquelle des réponses données correspondent à ma situation la plus



2
votes

Vous pouvez utiliser une expression régulière avec des groupes nommés. Cela suppose que la chaîne d'entrée est $ str code>: xxx pré>

ceci définira $ match code> à un peu plus que nécessaire, mais vous pouvez simplement Prenez-vous de ce dont vous avez besoin: P>

[
   0 => "Student - John Doe ate apples",
   "type" => "Student",
   1 => "Student",
   "who" => "John Doe",
   2 => "John Doe",
   "noun" => "apples",
   3 => "apples"
]


2 commentaires

C'est ce que je cherchais. Merci beaucoup!


C'est une solution assez intelligente.



0
votes

Vous pouvez également diviser la chaîne sur les modèles de caractères qui divisent les différentes parties.

$result = array_combine(['type', 'who', 'noun'], preg_split('/ - | ate /', $example));


3 commentaires

Merci! Celui que vous avez sélectionné avant est certainement plus robuste, cependant. Si vous utilisez quelque chose de simple comme celui-ci, vous devez faire attention à ce que toute chaîne que vous avez divisée n'est incluse dans aucune des pièces que vous essayez de séparer.


Vous avez raison. Pour des cas simples, j'utiliserais cela, pour les complexes, j'utiliserais l'autre. Merci encore pour ce tour! Quelqu'un vous a basculé pour que je ne puisse pas apporter votre vote à +1: (


Pas de soucis. Je me fiche des points. Tout le monde a droit à leur opinion. :-)