<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.sorcellerieweb.net/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Sorcellerie Web - Formules</title>
  <link>http://blog.sorcellerieweb.net/</link>
  <description>Bienvenue dans l'antre d'un sorcier du web. Ici vous seront dévoilées les formules les plus secrètes, les potions les plus goutues, les sorts les plus faramineux pour en mettre plein la vue à vos collègues nerds avec votre sorcellerie web niveau 36. Ou au moins à mettre en ligne un gif animé.</description>
  <language>fr</language>
  <pubDate>Thu, 28 Aug 2008 11:22:26 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Fichiers de configuration</title>
    <link>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration</link>
    <guid isPermaLink="false">urn:md5:6141a8df36266042717321c4a8302074</guid>
    <pubDate>Fri, 07 Dec 2007 16:27:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>ini</category><category>php</category><category>pratique</category><category>python</category><category>xml</category><category>yaml</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/advanced-directory.png&quot; alt=&quot;configuration-48x48&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Lorsqu'on développe une application
ou un composant de manière à pouvoir le réutiliser, il est nécessaire de
pouvoir définir une configuration d'environnement de manière séparée du code.
Cela peut être fait par inclusion d'un fichier se contentant de déclarer un
suite de variables ou de constantes dans le language de l'application (c'est le
cas des fichiers urls.py et settings.py de Django). Mais il est généralement
préférable d'utiliser un format qui puisse être lu et modifié par un
non-programmeur.&lt;/p&gt;    &lt;h3&gt;Le format INI&lt;/h3&gt;
&lt;p&gt;A la fois très simple et très largement utilisé, le &lt;a href=&quot;http://fr.wikipedia.org/wiki/Fichier_INI&quot;&gt;format INI&lt;/a&gt; permet de définir des
paires clefs/valeur, éventuellement organisées par sections. Il est
suffisamment intuitif pour être modifié par quelqu'un qui n'en connait pas la
syntaxe.&lt;/p&gt;
&lt;p&gt;C'est le format de configuration de PHP, et une &lt;a href=&quot;http://fr.php.net/manual/fr/function.parse-ini-file.php&quot;&gt;fonction native&lt;/a&gt;
permet de lire un tel fichier et de récupérer directement les données stockées
dans un tableau associatif, à deux dimensions en activant le support des
sections.&lt;/p&gt;
&lt;p&gt;Python dispose du module &lt;a href=&quot;http://docs.python.org/lib/module-ConfigParser.html&quot;&gt;ConfigParser&lt;/a&gt;, qui
supporte une syntaxe un peu plus évoluée.&lt;/p&gt;
&lt;h3&gt;Le format XML&lt;/h3&gt;
&lt;p&gt;Le patriarche des formats de structuration et d'échange de données. Plus
qu'un format de fichier, &lt;a href=&quot;http://fr.wikipedia.org/wiki/Xml&quot;&gt;XML&lt;/a&gt; est
une grammaire dont dérivent des zillions de syntaxes, qu'elles soient
standardisées ou propriétaires. Très largement utilisé pour la configuration
d'application, ce n'est pourtant pas forcément des plus simples à éditer. De
plus, il est généralement assez lourd à manipuler en programmation, ce qui
n'est pas terrible en termes de performance. Surtout dans le cadre d'une
application web, si celle-ci doit lire le fichier à chaque requete...&lt;/p&gt;
&lt;h3&gt;Le format YAML&lt;/h3&gt;
&lt;p&gt;Si vous avez besoin de données de configuration plus élaborées, notamment
s'il vous faut plus de deux niveaux de données ou des textes sur plusieurs
lignes, il y a le &lt;a href=&quot;http://fr.wikipedia.org/wiki/Yaml&quot;&gt;format YAML&lt;/a&gt;.
Celui-ci se veut une alternative à XML, qui soit à la fois plus concise (donc
plus légère à stocker) et plus lisible pour un être humain. Ce qui en fait un
candidat idéal pour des fichiers de configuration. Comme en Python,
l'indentation y joue un rôle clef.&lt;/p&gt;
&lt;p&gt;Contrairement à INI, il n'est pas supporté nativement par PHP, mais la
&lt;a href=&quot;http://spyc.sourceforge.net/&quot;&gt;librairie Spyc&lt;/a&gt; permet de convertir
ces fichiers en tableaux de données et inversement.&lt;/p&gt;
&lt;p&gt;Python dispose de la librairie &lt;a href=&quot;http://pyyaml.org/&quot;&gt;PyYaml&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/183556</wfw:commentRss>
      </item>
    
  <item>
    <title>Détecter les préférences du navigateur</title>
    <link>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur</link>
    <guid isPermaLink="false">urn:md5:510611bfcda35e6c51595ad2ad8b719d</guid>
    <pubDate>Mon, 03 Dec 2007 19:34:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>ergonomie</category><category>http</category><category>i18n</category><category>php</category>    
    <description>&lt;p&gt;Il bien plus agréable pour l'internaute de disposer directement du contenu
qui le concerne (langue, navigateur, OS...) plutot que de devoir fouiller le
site web pour l'obtenir. Cela améliore son expérience de navigation, et donc
l'attrait pour votre site.&lt;/p&gt;    &lt;p&gt;Beaucoup d'entre nous se sont habitués à chercher, en arrivant sur un site,
s'il n'en existait pas une version dans sa propre langue. On cherche alors où
sont les petits drapeaux, les micro-liens avec code de langue sur deux
caractères, etc. Et beaucoup d'utilisateurs ne les trouvent pas, et quittent le
site immédiatement, faute de pratiquer la langue affichée. Pourtant, quand le
contenu d'un site est traduit, le plus gros du travail est fait; pourquoi ne
pas l'afficher directement dans la langue spécifiée par l'internaute pour son
navigateur ?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/bookmarklets_delicious_oper.png&quot; alt=&quot;bookmarklets_delicious_oper.png&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Ceci est également valable pour d'autres
préférences. La &lt;a href=&quot;http://www.mozilla-europe.org/fr/products/firefox/&quot;&gt;page de téléchargement de
Firefox&lt;/a&gt; par exemple est non seulement traduite dans la langue de
l'internaute, mais la version proposée au téléchargement est celle
correspondant à son système d'exploitation. Tout aussi efficace, la &lt;a href=&quot;http://del.icio.us/help/buttons&quot;&gt;page de &lt;em lang=&quot;en&quot;&gt;bookmarklets&lt;/em&gt;&lt;/a&gt; pour &lt;a href=&quot;http://del.icio.us&quot;&gt;Del.icio.us&lt;/a&gt;
est automatiquement adaptée au navigateur en cours. Ceci est possible grâce aux
données de préférences et d'environnement utilisateur transmises par le
navigateur au serveur web via les en-têtes HTTP.&lt;/p&gt;
&lt;p&gt;Outre les préférences de langue, et les particularités eventuelles de
l'environnement système d'exploitation/navigateur, il peut être souhaitable de
détecter le support de javascript, surtout pour les sites utilisant ajax pour
certaines de leurs fonctionnalités. Tout comme le support de flash. La liste
est longue, car les possibilités d'HTTP sont encore largement
sous-utilisées.&lt;/p&gt;
&lt;p&gt;Bien evidemment, il faut garder à l'esprit que ces données ne sont pas
fiables, et ne doivent être utilisées que pour définir la version du contenu
par défaut, et toujours permettre à l'utilisateur de modifier ces réglages si
possible via des liens et des contrôles manuels.&lt;/p&gt;
&lt;p&gt;Pour ce qui est de PHP, vous pouvez utiliser un de mes bouts de script (
&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP&quot; hreflang=&quot;en&quot;&gt;getting browser language settings with php&lt;/a&gt;), ou la &lt;a href=&quot;http://phpsniff.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;classe phpsniff&lt;/a&gt; qui semble
bien plus complete (pas encore utilisée, je viens de tomber dessus).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2007/12/03/#&quot; title=&quot;Additious&quot;&gt;&lt;img src=&quot;http://www.additious.com/images/additious_boutons/additious_orange.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/181418</wfw:commentRss>
      </item>
    
  <item>
    <title>Optimisation PHP : les chaines de caractères</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres</link>
    <guid isPermaLink="false">urn:md5:20089db4b87600f50fa4ca0d8edabb4f</guid>
    <pubDate>Fri, 30 Nov 2007 12:16:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>optimisation</category><category>php</category>    
    <description>&lt;p&gt;Voici une petite astuce concernant les chaînes de caractères pour optimiser
vos scripts PHP, que certains découvriront peut-être. Prenez l'habitude
d'utiliser les apostrophes (&lt;q lang=&quot;en&quot;&gt;simple quotes&lt;/q&gt;)
plutôt que les guillemets (&lt;q lang=&quot;en&quot;&gt;double quotes&lt;/q&gt;). Ceci
parce que les chaines entre guillemets peuvent contenir des variables qui
seront évalués à l'éxécution. Par exemple :&lt;/p&gt;    &lt;pre&gt;
&lt;code&gt;$uper_riche='Picsou';

// ceci affiche : Bonjour, je suis Picsou
echo &amp;quot;Bonjour, je suis $uper_riche&amp;quot;;

// alors que ceci affiche : Bonjour, je suis $uper_riche
echo 'Bonjour, je suis $uper_riche';

// on peut utiliser les accolades pour acceder à des noms complexes
$Picsou-&amp;gt;neveux=array('Riri','Fifi','Loulou');
// ceci affichera : Le second neveu de Picsou est Fifi, il en a trois
echo &amp;quot;Le second neveu de Picsou est {$Picsou-&amp;gt;neveux[1]}, il en a trois&amp;quot;;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Ce qui double son travail, car le code est d'abord interprété une première
fois à la lecture du script et découpé en blocs sémantiques (&lt;q lang=&quot;en&quot;&gt;chunks&lt;/q&gt;) : variables, chaines, instructions etc. Une chaine
entre apasotrophes sera alors conservée telle quelle jusqu'à la fin de
l'execution du script, alors qu'une chaine entre guillemets devra être
interprétée à chaque évaluation. Par conséquent, il vaut mieux les éviter
autant que possible. Par exemple :&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/**
* on construit une chaine de caracteres dynamiques en separant bien les chunks variables des blocs statiques
*/
$html='&amp;lt;p&amp;gt;Bonjour, je suis '.$uper_riche.'&amp;lt;/p&amp;gt;';

/**
* on ne force pas l'evaluation du parametre passe a une fonction
*/
echo 'Qui est le plus riche ? '.strtoupper('picsou !');

/**
* idem pour les clefs d'un tableau associatif
*/
echo $personnages['picsou']['neveux'][1];&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;C'est le genre de petites choses qui peuvent paraitre évidentes une fois
devenues une habitude, mais qui ensuite évitent de plomber vos scripts
inutilement.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/180560</wfw:commentRss>
      </item>
    
  <item>
    <title>Afficher son adresse email, mais la protéger du spam</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/08/Afficher-son-adresse-email-mais-la-proteger-du-spam</link>
    <guid isPermaLink="false">urn:md5:c2badf6d7cbb91597775503e69ec052a</guid>
    <pubDate>Thu, 08 Nov 2007 10:05:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>css</category><category>html</category><category>spam</category>    
    <description>    &lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/astuce-48x48.png&quot; alt=&quot;astuce-48x48.png&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Comment donner son adresse de courriel à
ses visiteurs, tout en la cachant aux yeux des moteurs cherchant des adresses à
spammer ? Un usage courant est d'injecter des blocs parasites dans l'adresse,
tels que identifiant[pas-de-spam-svp]@[enlevez-ceci]domaine.net. Ce qui n'est
pas très lisible. Ma parade, c'est de masquer ces parasites avec une simple
règle CSS. Ce qui donne :&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;HTML :
&amp;lt;a href=&amp;quot;mailto:identifiant@[enlevez-ceci]domaine.net&amp;quot;&amp;gt;
    identifiant@&amp;lt;span class=&amp;quot;junk&amp;quot;&amp;gt;[enlevez-ceci]&amp;lt;/span&amp;gt;domaine.net
&amp;lt;/a&amp;gt;&lt;/code&gt;

&lt;code&gt;CSS :
.junk {
    display: none;
}&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Et affichera : &lt;a href=&quot;mailto:identifiant@[enlevez-ceci]domaine.net&quot;&gt;identifiant@domaine.net&lt;/a&gt;. Il
faudra toujours supprimer à la main les blocs parasites en cas de clic sur le
lien ou de copier-coller, mais l'adresse sera plus facile à noter :)&lt;/p&gt;
.</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/08/Afficher-son-adresse-email-mais-la-proteger-du-spam#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/08/Afficher-son-adresse-email-mais-la-proteger-du-spam#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178158</wfw:commentRss>
      </item>
    
  <item>
    <title>Some CSS-related javascript utility functions</title>
    <link>http://blog.sorcellerieweb.net/post/2005/09/16/Some-CSS-related-javascript-utility-functions</link>
    <guid isPermaLink="false">urn:md5:c4d5bc270f36d349ab3e78ac2d6b5dd3</guid>
    <pubDate>Fri, 16 Sep 2005 20:04:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>code-source</category><category>css</category><category>javascript</category>    
    <description>&lt;p&gt;Hi folks. Nothing very bright or revolutionary, but here is a tiny library
to play with CSS and javascript. More elaborate tricks to come. Hope it
helps.&lt;/p&gt;    &lt;ul&gt;
&lt;li&gt;bool hasClass(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;cName&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool hasClasses(DOM &lt;var&gt;obj&lt;/var&gt;, array &lt;var&gt;classes&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool addClass(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;cName&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool removeClass(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;cName&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool swapClasses(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;class1&lt;/var&gt;, string
&lt;var&gt;class2&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;bool switchClass(DOM &lt;var&gt;obj&lt;/var&gt;, string &lt;var&gt;to&lt;/var&gt;, string
&lt;var&gt;from&lt;/var&gt;)&lt;/li&gt;
&lt;li&gt;array getElementsByClassName(string &lt;var&gt;className&lt;/var&gt;, [DOM
&lt;var&gt;container&lt;/var&gt;],[string &lt;var&gt;tag&lt;/var&gt;])&lt;/li&gt;
&lt;/ul&gt;
&lt;code&gt;/* CSS-related javascript functions by Fred Bird http://fredbird.org
License : Public Domain file version 16/09/2005 09:30:45 */ /* has the DOM
object a certain class ? obj = DOM object, cName = a class name */ function
hasClass(obj,cName) { return new RegExp('\\b'+cName+'\\b').test(obj.className);
} /* has the DOM object a set of classes ? obj = DOM object, classes=array of
class names */ function hasClasses(obj,classes) { for (f=0;
f&amp;lt;classes.length; f++) { if (!hasClass(obj,classes[i])) return false; }
return true; } /* add a class to a DOM object if necessary obj = DOM object,
cName = a class name */ function addClass(obj,cName) { if
(!hasClass(obj,cName)) { obj.className+=obj.className?' '+cName:cName; } return
true; } /* removes a class from a DOM object obj = DOM object, cName = a class
name */ function removeClass(obj,cName) { if (!hasClass(obj,cName)) return
false; var rep=obj.className.match(' '+cName)?' '+cName:cName;
obj.className=obj.className.replace(rep,''); return true; } /* swap two classes
for a DOM object, whatever provided order */ function
swapClasses(obj,class1,class2) { if (hasClass(obj,class1)) {
removeClass(obj,class1); addClass(obj,class2); return true; } if
(hasClass(obj,class2)) { removeClass(obj,class2); addClass(obj,class1); return
true; } return false; } /* sets class 'to' to the DOM object obj, removes class
'from' if necessary */ function switchClass(obj,to,from) { if
(hasClass(obj,from)) removeClass(obj,from); addClass(obj,to); return true; } /*
returns an array of DOM objects having the provided class name within object
'container' and with tag name 'tag' some code from
http://www.webmasterworld.com/forum91/1757.htm (unbugged) */ function
getElementsByClassName(className,container,tag) { // default container to
document container=container||document; // default tag to * tag=tag||'*'; //
listing container descendants var all =
container.all||container.getElementsByTagName(tag); var found=new Array(); //
searching for targets for (f=0; f&amp;lt;all.length; f++) { var el=all[f]; if
(hasClass(all[f],className)) { found.push(all[f]); } } return found; }&lt;/code&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2005/09/16/Some-CSS-related-javascript-utility-functions#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2005/09/16/Some-CSS-related-javascript-utility-functions#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178161</wfw:commentRss>
      </item>
    
  <item>
    <title>Getting browser language settings with PHP</title>
    <link>http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP</link>
    <guid isPermaLink="false">urn:md5:63cca60a8c3d5fe20056ad823047f59b</guid>
    <pubDate>Tue, 13 Sep 2005 20:02:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>code-source</category><category>http</category><category>i18n</category><category>php</category>    
    <description>&lt;p&gt;So, you run a multilingual web site with &lt;acronym title=&quot;Hypertext PreProcessor&quot;&gt;PHP&lt;/acronym&gt; and you want to serve the reader's
choice language if available. No problem, &lt;acronym title=&quot;HyperText Transfert Protocol&quot;&gt;HTTP&lt;/acronym&gt; carries user's browser language
settings within &lt;q&gt;Accept-Language&lt;/q&gt; instruction, you just have to parse it.
Here is a sample function.&lt;/p&gt;    &lt;pre&gt;
&lt;code&gt;function parseHttpAcceptLanguage($str=NULL) {
        // getting http instruction if not provided
        $str=$str?$str:$_SERVER['HTTP_ACCEPT_LANGUAGE'];
        // exploding accepted languages 
        $langs=explode(',',$str);
        // creating output list
        $accepted=array();
        foreach ($langs as $lang) {
                // parsing language preference instructions
                // 2_digit_code[-longer_code][;q=coefficient]
                ereg('([a-z]{1,2})(-([a-z0-9]+))?(;q=([0-9\.]+))?',$lang,$found);
                // 2 digit lang code
                $code=$found[1];
                // lang code complement
                $morecode=$found[3];
                // full lang code
                $fullcode=$morecode?$code.'-'.$morecode:$code;
                // coefficient
                $coef=sprintf('%3.1f',$found[5]?$found[5]:'1');
                // for sorting by coefficient
                $key=$coef.'-'.$code;
                // adding 
                $accepted[$key]=array('code'=&amp;gt;$code,'coef'=&amp;gt;$coef,'morecode'=&amp;gt;$morecode,'fullcode'=&amp;gt;$fullcode);
        }
        // sorting the list by coefficient desc
        krsort($accepted);
        return $accepted;
}&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;This function will parse a given HTTP &lt;q&gt;Accepted language&lt;/q&gt; instruction
(or retrieve it from &lt;var&gt;$_SERVER&lt;/var&gt; if not provided) and will return a
sorted array. For example, it will parse &lt;q&gt;fr;en-us;q=0.8&lt;/q&gt; to :&lt;/p&gt;
&lt;code&gt;[1.0-fr]=&amp;gt;([code]=&amp;gt;'fr','morecode'=&amp;gt;'fr',[coef]=&amp;gt;'1.0',[fullcode]=&amp;gt;'fr')
,[0.8-en]=&amp;gt;([code]=&amp;gt;'en','morecode'=&amp;gt;'us',[coef]=&amp;gt;'0.8',[fullcode]=&amp;gt;'en-us')&lt;/code&gt;
&lt;p&gt;The next thing will be to find and serve the first available version amongst
user's accepted languages. Easy.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178156</wfw:commentRss>
      </item>
    
  <item>
    <title>Faire planter Internet Explorer avec une feuille de style</title>
    <link>http://blog.sorcellerieweb.net/post/2004/11/17/Faire-planter-Internet-Explorer-avec-une-feuille-de-style</link>
    <guid isPermaLink="false">urn:md5:91516775218d7e0aed52df2da4a10116</guid>
    <pubDate>Wed, 17 Nov 2004 15:48:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>css</category><category>ie</category>    
    <description>    &lt;p&gt;Au cours d'un développement professionnel, je me suis aperçu qu'il était
possible de faire &lt;em&gt;crasher&lt;/em&gt; IE 6 avec une simple feuille de style. En
l'occurence, il s'agissait de la conjonction suivante :&lt;/p&gt;
&lt;code&gt;HTML : &amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;...&amp;quot;&amp;gt;un lien&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/code&gt;
&lt;code&gt;CSS : p:first-letter { font-size: 200%; float: left; margin-right: 0.3em;
}&lt;/code&gt;
&lt;p&gt;Il semblerait que le fait que la première lettre du paragraphe soit contenue
dans un lien, voire une balise fille (je n'ai pas essayé), suffise à provoquer
une erreur fatale dans le moteur de rendu d'Internet Explorer 6...&lt;/p&gt;
&lt;p&gt;Une raison de plus de passer à &lt;a href=&quot;http://www.mozilla-europe.org&quot; lang=&quot;en fr es de&quot;&gt;Firefox&lt;/a&gt; !&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2004/11/17/Faire-planter-Internet-Explorer-avec-une-feuille-de-style#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2004/11/17/Faire-planter-Internet-Explorer-avec-une-feuille-de-style#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/179224</wfw:commentRss>
      </item>
    
</channel>
</rss>