2 votes

Générer une regex à partir d'une fonction en PHP

J'ai besoin d'une fonction qui pourrait générer une expression régulière. Par exemple, si j'écris

$pat = "Mon {$var} est {$var2}"

pour générer une expression régulière que j'utiliserai avec

preg_match($pat,"Mon nom est Kevin",$matches);

afin d'obtenir

$matches[1] = 'nom';
$matches[2] = 'Kevin';

et la chaîne pourrait être : "Mon $motnom est $nom et j'ai $âge ans"

Et le problème est :

FIG1

}
?>

FIG2
$pat = gen_pattern('mon nom est {$X}');
ereg($pat,'mon nom est vache',$regs);
//$regs[1] == "vache„
([^\s]*)

$pat = gen_pattern('mon {$YZ} est {$IJK}');
ereg($pat,'mon nom est vache',$regs);
//$regs[1] == "nom", $regs[2] == "vache"

La description de mon devoir est la suivante :

La Figure 1 montre une fonction qui peut générer une expression régulière, utilisable pour la fonction ereg.

La Figure 2 montre comment le motif devrait fonctionner. Dans la chaîne donnée, chaque élément {$ABC} représente un espace réservé, c'est-à-dire que {$X} est l'espace réservé unique dans "mon nom est {$X}", et il y a deux espaces réservés dans "mon {$YZ} est {$IJK}". Un espace réservé peut avoir n'importe quelle longueur supérieure à zéro.

Dans le motif résultant, chaque espace réservé représente un mot unique du texte, qui doit être ajouté à la liste des résultats. Par exemple, {$X} représente le prochain mot après "mon nom est". Par conséquent, $regs[1] devient "vache" si le motif est utilisé sur le texte "mon nom est vache". Supposons que nous ayons uniquement des textes de la forme [a-z ]* (notez l'espace blanc).

Ma tâche :

Remplissez l'endroit vert dans la Figure 1. Ne vous embêtez pas avec la gestion des erreurs ou la vérification de la syntaxe correcte de la chaîne donnée (c'est-à-dire que les entrées invalides telles que "mon nom est {{}" ou similaire ne se produiront pas).

Et je ne sais par où commencer.

2voto

k102 Points 3481

Cela peut fonctionner:

function gen_pattern($str){
    $str = preg_replace('/(\{[\$a-zA-Z]+\})/', '(\w+)', $str);
    return '/'.$str.'/';
}
$p = gen_pattern('my {$xx} is {$X}');

preg_match($p, 'my name is moo', $m);

$m sera:

array(3) {
  [0] =>
  string(14) "my name is moo"
  [1] =>
  string(4) "name"
  [2] =>
  string(3) "moo"
}

0voto

Anton Points 663

Quelque chose comme ceci vous aidera..:

function gen_pattern($string)
{
    return "@".preg_replace("@(\{\$(.*?)\})@msi", "(?P<$2>.*?)", $string)."@";
}

donc vous obtiendrez un résultat avec vos variables comme clés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X