[Expression] ! pour les connaisseurs!

Pour tracer les ET OU XOR et autres on peut faire simple :

function evaluate($_string) {
	if (!isset($GLOBALS['ExpressionLanguage'])) {
		$GLOBALS['ExpressionLanguage'] = new ExpressionLanguage();
	}
	$string=$_string;
	//$string = str_ireplace(array(' et ', ' and ', ' ou ', ' or ', ' xor '), array(' && ', ' && ', ' || ', ' || ', ' ^ '), $_string);
	if ($_string != str_ireplace(array(' et ', ' and ', ' ou ', ' or ', ' xor '), array(' && ', ' && ', ' || ', ' || ', ' ^ '), $_string)){
		log::add('expression', 'debug', 'La chaine : ' . $_string . ' n\'est pas conforme à la syntaxe PHP');
	}

Tu peut pas faire çà, tout les tests sur des chaines contenant et, ou etc vont remonter.
If variable(loup) == 1 boum, alors que c’est correcte.

Perso, si tu coche l’option « syntaxe stricte » en config, ben tu sais ce que tu fait. Une option en config c’est pas une couleur de texte … :yawning_face: Par default, aucun changement, aucun problème, si ce n’est les soucis actuels comme d’hab.

justement c’est l’objectif : ça teste juste le remplacement … c’est ni plus ni moins que ce que ça fait actuellement…
Si on a des || etc, ça remplace rien… donc on est conforme

Quand y’aura plus que çà à faire :rofl:

Mon fix a pété quoi alors ? :thinking:

rien cassé ça fonctionne :star_struck:

PS le test c’est pour nous, hein

Ah ben oui ben vas y, je croyais que tu parlais de mettre çà avec l’option dans le core.
J’essaye de faire un bloc code pour balancer des 10aines de test à la volée dans le moteur :crazy_face:

Pourquoi tu dis ça kiboost, naboleo a testé la chaîne ' ou ' pas la chaîne 'ou'. Je vois pas où est le problème avec ce qu’il a proposé pour signaler une incorrection syntaxique ?

Oui tu a raison y’a quand même les espaces. Mais pourtant ça cause des problèmes au vue des remontées.

bref, log ou pas c’est pas le sujet pour moi. Ce qui m’intéresse c’est comment améliorer l’algo.

1 « J'aime »

Bloc code de test pour ceux qui trafiquent le code :beers:

function testExpr($expr) {
	global $scenario;
  	$sc = null;
	$return = array();
  	$return['evaluate'] = scenarioExpression::setTags(jeedom::fromHumanReadable($expr), $sc, true);
	$return['result'] = evaluate($return['evaluate']);
	$return['correct'] = 'ok';
	if (trim($return['result']) == trim($return['evaluate'])) {
		$return['correct'] = 'nok';
	}
	$scenario->setLog($expr. ' -> ' . json_encode($return));
}

testExpr("strlen('to,to')");
testExpr("round(#mois#*(-1.15*#mois#+15)+5)");
testExpr("substr('toto et titi', 0, 8)");
testExpr('#[Maison][Thermostat][Order]# < 30 && #[Maison][Météo][Temperature]# > -30');

Le round pose encore soucis …

j’arrive pas à suivre la, vous partez dans tous les sens :smiley:

y’a besoin de tester qqchose en php5 au final, ou pas ? Si oui, j’ai réussi à adapter mon dockerfile pour démarrer un container stretch php5 jeedom en qq minutes, ça vous permet de tester les scénarios tant qu’il n’y a pas besoin de plus.

Pour les tests de et / ou / and / or … il faut utiliser les regex avec les limites de mot les \b ça donne ceci par exemple pour le ou : regex101: build, test, and debug regex

$array = ["Variables('Loup', 1)",
  "(expr1)ou(expr2)",
  "expr1 ou expr2"];
// rechercher ou or et and
$search = ['/\b(ou)\b/', '/\b(or)\b/', '/\b(et)\b/', '/\b(and)\b/'];
// remplacer par || ou bien &&
$repl = [' || ', ' || ', ' && ', ' && '];

foreach( $array as $value ){
    echo preg_replace($search, $repl, $value);
}

Quoi qu’il en soit, il serait préférable d’upgrader en php7 et pouvoir utiliser le moteur d’expression de symfony qui est éprouvé :slight_smile:

1 « J'aime »

Pour ma part les logs de cette nuit sont propres… Rien cassé sauf ça

PHP Notice:  Uninitialized string offset: 0 in /var/www/html/core/class/scenarioExpression.class.php on line 1167
PHP Notice:  Uninitialized string offset: -1 in /var/www/html/core/class/scenarioExpression.class.php on line 1167
PHP Notice:  Uninitialized string offset: 0 in /var/www/html/core/class/scenarioExpression.class.php on line 1167
PHP Notice:  Uninitialized string offset: 0 in /var/www/html/core/class/scenarioExpression.class.php on line 1167

Bon pour retrouver à quoi ça correspond par contre, ça va être plus chaud

Si tu peux valider que symfony v5.1 tourne sur un jeedom php5 au moins on aura la réponse ? çà peux pas faire de mal d’y passer, mais faut que çà tourne partout.

Ta ligne c’est pas çà ?
if ($match[2][0] == $match[2][strlen($match[2]) - 1] && ($match[2][0] == '"' || $match[2][0] == "'")) {

si la chaine est vide, ‹  ›, çà coince je pense. un if strlen >1 peu etre.

genre:
if (strlen($match[2]) > 1 && $match[2][0] == $match[2][strlen($match[2]) - 1] && ($match[2][0] == '"' || $match[2][0] == "'")) {

Oui c’est celle-ci :+1:
Le test est pas bête, à voir. Je le rajoute.

Attention on est sur des fonctions exécutées plusieurs fois par seconde. Le regex est plus lent qu’un str_replace. Faut vraiment garder l’aspect perf dans toutes les modifs.

si c’était plusieurs millions de fois on pourrait hésiter, mais la, « seulement » plusieurs fois par seconde on peut se permettre d’utilier quelque regex je crois non? :wink:

Bon ben c’est moins concluant là

  • tag()
  • #ID#

En effet. Mais çà mérite de creuser en ce sens non ?
c quoi dans ton expression avec tag(force ??

oui, c’est pas négatif. ça veut juste dire que l’impact de l’autoquote va loin dans les fonctions de base.

Tag(), je m’en sers pour forcer l’envoi des consignes s’il existe

mais c’est quoi ton tag(force,") ?? c un double quote ou deux simple quote ??

bon je file, retour dans l’aprem