Toujours pour établir les liens entre défintions !

10 messages   •   Page 1 sur 1
Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

30 mai 2007, 09:49

Bonjour,

Pour être le plus explicite voici ma problématique :
J'ai une définition, par exemple ActiveX
Standard pour intégrer dans une page web des programmes qui améliorent les capacités du navigateur. On a l'habitude de parler de contrôles OLE et d'OCX.
Nouvelle appellation de la technologie OLE de microsoft. ActiveX et Java ouvrent de nouvelles possibilités dans la création de pages web dynamiques. Les contrôles ActiveX peuvent être écrits en C, C++ ou Java peu peuvent être activés par du code Vbscript dans le HTML.
une liste de mot avec une définition
518#Navigateur;1643#Microsoft;1470#Vbscript;13#ActiveX;668#Script;129#Code;391#HTML;431#Java;548#OLE;1234#OCX;1050#C++;69#C;
Mon problème est de mettre les mots ci dessus en lien dans ma définition !

Actuellement avec mon script j'obtient ca :
Standard pour intégrer dans une page web des programmes qui améliorent les capacités du navigateur. On a l'habitude de parler de contrôles <a class="couleur1" href="?Id=548">OLE</a> et d'<a class="couleur1" href="?Id=1234">O<a class="couleur1" href="?Id=69">C</a>X</a>. <BR>Nouvelle appellation de la technologie <a class="couleur1" href="?Id=548">OLE</a> de microsoft. <a class="couleur1" href="?Id=13">ActiveX</a> et <a class="couleur1" href="?Id=431">Java</a> ouvrent de nouvelles possibilités dans la création de pages web dynamiques. Les contrôles <a class="couleur1" href="?Id=13">ActiveX</a> peuvent être écrits en <a class="couleur1" href="?Id=69">C</a>, <a class="couleur1" href="?Id=1050"><a class="couleur1" href="?Id=69">C</a>++</a> ou <a class="couleur1" href="?Id=431">Java</a> peu peuvent être activés par du code <a class="couleur1" href="?Id=1470">Vbscript</a> dans le <a class="couleur1" href="?Id=391">HTML</a>
Vous remarque que pour C++ et OCX j'ai un petit soucis ! mon script utiliser un str_replace qui n'est pas adapté à la problématique. Je suis preneur pour toute subjection et méthodologie pour ressoudre ce problème !

Merci
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Mammouth du PHP | 19672 Messages

30 mai 2007, 14:03

:idea: Et un preg_replace() avec des tableaux : tu pourrais avoir un tableau à deux dimensions :
$t['motcle'] et $t['definition'] :?:
Le problème consisterait à parser le texte pour constituer le tableau.

À moins de déplacer le problème en amont et préparer l'application au moment d'ajouter une définition : avec une interface de saisie enrichie (genre TinyMCE ou FCKEditor) et marquer les mots clés : il faudrait alors créer un système te permettant de vérifier si une définition existe déjà ou bien afficher une zone de saisie pour ajouter une nouvelle définition...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

30 mai 2007, 15:45

Le mise en place des liens doit être fait à l'affichage, je ne peux pas modifier la définition car elles seront utilisé ailleurs (webservice) où les liens ne seront pas fait.

:P si j'ai posé la question c'est que la problématique est pas simple !
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 mai 2007, 16:33

Quelle est la taille de ta liste de définitions ? Histoire de voir la complexité algorithmique qu'on peut se permettre.

Est-ce qu'on doit être insensible à la casse ? autoriser des partial matches ? (par exemple "Navigateurs")

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

30 mai 2007, 16:44

Actuellement j'ai 7400 définitions mais je vire les extensiosn de fichier donc dans les 4000 définitions à prendre en compte.

Il faut être insensible à la casse et autoriser les partial matches

Je peux faire une extraction SQL de la table de définitions ci besoin.
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 mai 2007, 16:57

Je veux bien une copie des données en question si tu veux. Sinon, essaie de benchmarker ça voir si c'est aussi lent que je le pense. (~7000 defs ça risque de faire beaucoup...)

PS: si tes données sont en UTF-8 il te faut changer le strtolower() et rajouter le flag qui-va-bien à preg_replace_callback()
PPS: en y réfléchissant on a pas besoin du second isset() dans replace_defs_callback()
<?php

$text = "Standard pour intégrer dans une page web des programmes qui améliorent les capacités du navigateur. On a l'habitude de parler de contrôles OLEs et d'OCX. 
Nouvelle appellation de la technologie ole de microsoft. ActiveX et Java ouvrent de nouvelles possibilités dans la création de pages web dynamiques. Les contrôles ActiveX peuvent être écrits en C, C++ ou Java peu peuvent être activés par du code Vbscript dans le HTML.";

echo replace_defs($text);


function cache_defs()
{
	$list = '518#Navigateur;1643#Microsoft;1470#Vbscript;13#ActiveX;668#Script;129#Code;391#HTML;431#Java;548#OLE;1234#OCX;1050#C++;69#C;';

	preg_match_all('/(.+?)#(.+?);/', $list, $m);
	$m[2] = array_map('strtolower', $m[2]);
	$defs = array_combine($m[2], $m[1]);
	$regex = '#(?:\\b|^)('. implode('|', array_map('preg_quote', $m[2])) . ')#i';

	file_put_contents('./data.defs.php', '<?php return ' . var_export($defs, true) . ';');
	file_put_contents('./regex.txt', $regex);
}

function replace_defs($text)
{
	static $regex;

	if (!isset($regex))
	{
		if (!file_exists('./regex.txt'))
		{
			cache_defs();
		}

		$regex = file_get_contents('./regex.txt');
	}

	return preg_replace_callback($regex, 'replace_defs_callback', $text);
}

function replace_defs_callback($m)
{
	/**
	* Pourrait être remplacé par une variable global préchargée pour de meilleures performances.
	* Dépends du nombre de hits
	*/
	static $defs;

	if (!isset($defs))
	{
		if (!file_exists('./data.defs.php'))
		{
			cache_defs();
		}

		$defs = include('./data.defs.php');
	}

	$def = strtolower($m[1]);
	return (isset($defs[$def])) ? '<a class="couleur1" href="?Id=' . $defs[$def] . '">' . $m[1] . '</a>' : $m[1];
}

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

30 mai 2007, 17:39

En fait mon système fonctionne en deux temps :
1 - Récupération des mots clés, je remplis je champ MotLienDef
2 - J'affiche une définition en y mettant les liens.

La partie 1, me suis pas mal démardé ! pour la partie 2 c'est la ou ca coince. Car y a un cas aussi que j'ai pas exposé

pas exemple : Langage le plus proche de celui compris par un microprocesseur. Est également appelé "langage machine".

En mot clé je vais avoir Language machine, langage et machine !

La chaine langage machine se retrouve avec 3 liens imbriqués.

Ce cas avec celui que j'ai donné ci dessus, je couvre je pense toutes les possibilités !
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

30 mai 2007, 18:06

avec un regex il est possible de tester si un mot se trouver entre un <a href et </a> ?
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 mai 2007, 18:11

La chaine langage machine se retrouve avec 3 liens imbriqués
Ça on peut l'éviter en classant les définitions par ordre de longueur décroissant.

Essaie avec ça, tu me diras ce que ça donne chez toi. J'essaierai d'y revenir un peu plus tard si possible.
<?php
function cache_defs()
{
	$list = '518#Navigateur;1643#Microsoft;1470#Vbscript;13#ActiveX;33#DVD-R;668#Script;129#Code;391#HTML;431#Java;548#OLE;1234#OCX;1050#C++;69#C;';

	preg_match_all('/(.+?)#(.+?);/', $list, $m);
	$m[2] = array_map('strtolower', $m[2]);
	$defs = array_combine($m[2], $m[1]);

	uksort($defs, create_function('$a,$b', 'return (isset($a[strlen($b)])) ? -1 : 1;'));

	$list = implode('|', array_map('preg_quote', $m[2]));

	// Modifie les caractères non-alpha de façon à ce que "CD-I", "CD/I" et "CDI" soit traités de la
	// même manière
//	$list = implode('|', array_map(create_function('$str', "return preg_replace('#\\W+(?=\\w)#', '\\\\W*', preg_quote(\$str, '#'));"), $m[2]));

	$regex = '#(?:\\b|^)('. $list . ')#i';

	file_put_contents('./data.defs.php', '<?php return ' . var_export($defs, true) . ';');
	file_put_contents('./regex.txt', $regex);
}

ViPHP
ViPHP | 5924 Messages

30 mai 2007, 20:31

Le mise en place des liens doit être fait à l'affichage, je ne peux pas modifier la définition car elles seront utilisé ailleurs (webservice) où les liens ne seront pas fait.

:P si j'ai posé la question c'est que la problématique est pas simple !
A ce propos, plutôt que d'ajouter les liens dynamiquement, ne serait-il pas plus simple de les retirer dynamiquement, c'est à dire lorsque tu en as besoin dans tes webservice, filtrer la chaine pour en enlever tous les liens ?

10 messages   •   Page 1 sur 1