¡Hola amigos! Necesito ayuda con expresiones regulares/etc. Necesito extraer claves virtuales de url, algún tipo de enrutador en la aplicación. Estos son los parametros:enrutador Php, extracción de claves de uri
Rule: /books/:category/:id/:keyname
Data: /books/php/12345/this-is-a-test-keyname
salida debería ser algo así:
array(
'category' => 'php',
'id' => '12345',
'keyname' => 'this-is-a-test-keyname'
);
Entonces, la pregunta es: ¿Cómo puedo hacer esto en php?
P.S Las combinaciones de reglas pueden variar. Entonces, las teclas principales son las palabras con el símbolo ':'. por ejemplo, como este:
/book-:id/:category/:keyname
/book/:id_:category~:keyname
P.S. 2: Esta es una pieza de código que tuve antes. Está funcionando, pero no es flexible.
function rule_process($rule, $data) {
// extract chunks
$ruleItems = explode('/',$rule);
$dataItems = explode('/',$data);
// remove empty items
array_clean(&$ruleItems);
array_clean(&$dataItems);
// rule and data supposed to have the same structure
if (count($ruleItems) == count($dataItems)) {
$result = array();
foreach($ruleItems as $ruleKey => $ruleValue) {
// check if the chunk is a key
if (preg_match('/^:[\w]{1,}$/',$ruleValue)) {
// ok, found key, adding data to result
$ruleValue = substr($ruleValue,1);
$result[$ruleValue] = $dataItems[$ruleKey];
}
}
if (count($result) > 0) return $result;
unset($result);
}
return false;
}
function array_clean($array) {
foreach($array as $key => $value) {
if (strlen($value) == 0) unset($array[$key]);
}
}
De hecho, esta versión del enrutador puede ser suficiente para mí, pero estoy interesado en cómo hacer la solución flexible. Por cierto, algunas pruebas: (30 veces de 10000 operaciones):
TEST #0 => Time:0.689285993576, Failures: 0
TEST #1 => Time:0.684408903122, Failures: 0
TEST #2 => Time:0.683394908905, Failures: 0
TEST #3 => Time:0.68522810936, Failures: 0
TEST #4 => Time:0.681587934494, Failures: 0
TEST #5 => Time:0.681943893433, Failures: 0
TEST #6 => Time:0.683794975281, Failures: 0
TEST #7 => Time:0.683885097504, Failures: 0
TEST #8 => Time:0.684013843536, Failures: 0
TEST #9 => Time:0.684071063995, Failures: 0
TEST #10 => Time:0.685361146927, Failures: 0
TEST #11 => Time:0.68728518486, Failures: 0
TEST #12 => Time:0.688632011414, Failures: 0
TEST #13 => Time:0.688556909561, Failures: 0
TEST #14 => Time:0.688539981842, Failures: 0
TEST #15 => Time:0.689876079559, Failures: 0
TEST #16 => Time:0.689854860306, Failures: 0
TEST #17 => Time:0.68727684021, Failures: 0
TEST #18 => Time:0.686210155487, Failures: 0
TEST #19 => Time:0.687953948975, Failures: 0
TEST #20 => Time:0.687957048416, Failures: 0
TEST #21 => Time:0.686664819717, Failures: 0
TEST #22 => Time:0.686244010925, Failures: 0
TEST #23 => Time:0.686643123627, Failures: 0
TEST #24 => Time:0.685017108917, Failures: 0
TEST #25 => Time:0.686363935471, Failures: 0
TEST #26 => Time:0.687278985977, Failures: 0
TEST #27 => Time:0.688650846481, Failures: 0
TEST #28 => Time:0.688835144043, Failures: 0
TEST #29 => Time:0.68886089325, Failures: 0
Por lo tanto, es lo suficientemente rápido. Estoy probando en una computadora portátil común. Entonces, seguro, este se puede usar en un sitio web real.
¿Alguna otra solución?
necesidad de utilizar preg_split –