aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Enderlin <ivan.enderlin@hoa-project.net>2013-07-11 16:18:37 +0200
committerIvan Enderlin <ivan.enderlin@hoa-project.net>2013-07-11 16:18:37 +0200
commit602656024a91e5092ebcaba7657e0ea66300a4e6 (patch)
tree8769a03a4974f45e4fc1f60906bb02dbffea1189
parent0f078509eebc421b655abf1ad2a255df30765650 (diff)
downloadRouter-602656024a91e5092ebcaba7657e0ea66300a4e6.zip
Router-602656024a91e5092ebcaba7657e0ea66300a4e6.tar.gz
Router-602656024a91e5092ebcaba7657e0ea66300a4e6.tar.bz2
Support internal options in rules.
-rw-r--r--Cli.php10
-rw-r--r--Documentation/Fr/Index.xyl37
-rw-r--r--Http.php15
3 files changed, 57 insertions, 5 deletions
diff --git a/Cli.php b/Cli.php
index 3e9077f..895779d 100644
--- a/Cli.php
+++ b/Cli.php
@@ -248,12 +248,18 @@ class Cli extends Generic implements \Hoa\Core\Parameter\Parameterizable {
$rule[Router::RULE_VARIABLES]['_call'] = &$rule[Router::RULE_CALL];
$rule[Router::RULE_VARIABLES]['_able'] = &$rule[Router::RULE_ABLE];
+ $caseless = 0 === preg_match(
+ '#\(\?\-[imsxUXJ]+\)#',
+ $rule[Router::RULE_PATTERN]
+ );
+
foreach($muri as $key => $value) {
if(!is_string($key))
continue;
- $key = strtolower($key);
+ if(true === $caseless)
+ $key = mb_strtolower($key);
if(isset($rule[Router::RULE_VARIABLES][$key]) && empty($value))
continue;
@@ -290,7 +296,7 @@ class Cli extends Generic implements \Hoa\Core\Parameter\Parameterizable {
return $variables[$m];
},
- $pattern
+ preg_replace('#\(\?\-?[imsxUXJ]+\)#', '', $pattern)
);
return str_replace(
diff --git a/Documentation/Fr/Index.xyl b/Documentation/Fr/Index.xyl
index a645cc7..5130645 100644
--- a/Documentation/Fr/Index.xyl
+++ b/Documentation/Fr/Index.xyl
@@ -281,6 +281,43 @@ var_dump($theRule[$router::RULE_VARIABLES]['format']);
* Will output:
* string(5) ".html"
*/</code></pre>
+ <p>Il est important de savoir que le routeur traite les requêtes et les règles
+ sans tenir compte de la <strong>casse</strong>, c'est à dire de la différence
+ entre majuscule et minuscule. D'ailleurs, les données extraites des variables
+ sont passées en <strong>minuscules</strong> selon les routeurs (ce qui est le
+ cas de <code>Hoa\Router\Http</code> par exemple). En effet, dans la plupart
+ des situations, il est souhaitable que le routeur soit insensible à la casse.
+ En revanche, il existe certains cas rares où la casse est importante. Par
+ exemple avec un moteur de recherche où les mots-clés de la recherche sont
+ contenus dans l'URI.</p>
+ <p>Les PCRE définissent les <em lang="en">internal options</em> permettant de
+ changer les options d'une expression à la volée et à l'intérieur même d'une
+ expression. Par exemple : les chaînes <code>foo/bar/baz</code> ou
+ <code>FOO/bAr/BaZ</code> correspondent à l'expression
+ <code>#foo/bar/baz#i</code> car l'option <em>globale</em> <code>i</code> rend
+ l'expression entièrement insensible à la casse. Si nous voulons que seulement
+ <code>bar</code> soit sensible à la casse, nous écrirons :
+ <code>#foo/(?-i)bar(?i)/baz#i</code>. Alors <code>FOO/bar/BaZ</code> sera
+ valide, tout comme <code>foo/bar/baz</code> mais pas <code>FOO/bAr/BaZ</code>.
+ Les options internes supportées par <code>Hoa\Router</code> sont de la forme
+ <code>(?<em>options</em>)</code> pour activer des options et
+ <code>(?-<em>options</em>)</code> pour désactiver des options. Dès qu'une
+ option interne <strong>désactive</strong> la casse, les données extraites de
+ toutes les variables ne seront pas passées en minuscule si c'était le cas
+ avant.</p>
+ <p>Par exemple, si nous voulons que tout ce qui suit <code>/hello_</code> soit
+ <strong>sensible</strong> à la casse, nous écrirons :</p>
+ <pre><code class="language-php">$router->get('h', '/hello_(?-i)(?&amp;lt;who>\w+)');
+$router->route('/hello_GorDON');
+$theRule = $router->getTheRule();
+var_dump($theRule[$router::RULE_VARIABLES]['who']);
+
+/**
+ * Will output:
+ * string(6) "GorDON"
+ */</code></pre>
+ <p>Il arrivera rarement que nous ayons besoin des options internes mais il est
+ important de les comprendre.</p>
<h3 id="Derouter" for="main-toc">Dérouter</h3>
diff --git a/Http.php b/Http.php
index 4e1b0e8..47539ff 100644
--- a/Http.php
+++ b/Http.php
@@ -386,17 +386,26 @@ class Http extends Generic implements \Hoa\Core\Parameter\Parameterizable {
$rule[Router::RULE_VARIABLES]['_able'] = &$rule[Router::RULE_ABLE];
$rule[Router::RULE_VARIABLES]['_request'] = $_REQUEST;
+ $caseless = 0 === preg_match(
+ '#\(\?\-[imsxUXJ]+\)#',
+ $rule[Router::RULE_PATTERN]
+ );
+
foreach(array_merge($muri, $msubdomain) as $key => $value) {
if(!is_string($key))
continue;
- $key = strtolower($key);
+ if(true === $caseless)
+ $key = mb_strtolower($key);
if(isset($rule[Router::RULE_VARIABLES][$key]) && empty($value))
continue;
- $rule[Router::RULE_VARIABLES][$key] = strtolower($value);
+ if(true === $caseless)
+ $value = mb_strtolower($value);
+
+ $rule[Router::RULE_VARIABLES][$key] = $value;
}
$this->_rule = $rule;
@@ -582,7 +591,7 @@ class Http extends Generic implements \Hoa\Core\Parameter\Parameterizable {
return $variables[$m];
},
- $pattern
+ preg_replace('#\(\?\-?[imsxUXJ]+\)#', '', $pattern)
);
return str_replace(