Pregunta

He Apache de mi servidor configurado para redirigir todas las peticiones en index.php, de modo que pueda utilizar URLs como:

http://www.website.com/about/us

Ahora tengo que analizar la URL con el fin de determinar si existe cada ruta y qué esperar de él, para poder establecer una tabla de base de datos para guardar las rutas y así mis clientes pueden editar sus rutas ya que ellos les gusta estar . Lo que pasa es que no soy capaz de hacer el análisis hasta ahora.

Aquí está mi código:

$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
    echo 'the route doesn\'t match';
    exit();
}

Siempre que aparece el mensaje de eco. ¿Qué estoy haciendo mal?

editar

La razón por la que necesito expresión regular es el siguiente. Imagínese que tengo un segmento url como:

/user/yoda

La expresión regular aquí sería muy útil para analizar el primer argumento como una acción o una página, y el segundo como una clave que sólo permite un cierto conjunto de caracteres, como si quiero esperar, en este caso, la segunda paramenter Sólo para que coincida con "_-azAZ09", algo como esto. En otras palabras, el conjunto de expresiones de expresiones regulares sería de mí en comparación con el URI con el fin de determinar si alguno de ellos coincide con el uri, y determinar la acción a tomar a partir de ese sobre. Utilizando la función de explotar me haría evaluar los segmentos de uri adelante en el código, cosa que me gustaría evitar. Si no hay coincidencia con el URI, reenviar immediatelly la página 404 a un uno y romper la operación. No se si me he explicado bien .. hice

¿Fue útil?

Solución

En lugar de utilizar expresiones regulares, ¿por qué no simplemente dividir el URI entrante?

$uri = 'about/us';
list($page, $action) = explode('/', $uri);

Si necesita más de dos, basta con quitar la lista:

$pagePath = explode('/', $uri);

Pero, si insisten en el uso de expresiones regulares, esto va a hacer:

$regex = '#(?P<page>.*)/(?P<action>.*)#';

Sin embargo, se le ofrece nada especial, excepto que $ coincidencias ahora contendrá $matches['page'] y $matches['action'] - pero si realmente lo necesita, uso youcan list() como se muestra arriba

.
  

Uso de la función de explotar haría   Me evaluar los segmentos de uri más adelante en   el código, cosa que me gustaría evitar

En lugar de hacer que la página es válida por él es el conjunto de caracteres, ¿por qué no compila una lista de la tabla de páginas de búsqueda válida y sólo tiene que utilizar in_array de php que es mucho más rápido que una expresión regular? La extracción de los segmentos de URL en una matriz le permitirá tener matrices multidimensionales validados en ningún momento.

Otros consejos

Creo que la expresión regular necesita ser rodeado por un símbolo; por ejemplo '@(page(/<action>))@'. Véanse los ejemplos en http://php.net/preg_match

Si es absolutamente necesario utilizar una expresión regular por alguna razón, intente lo siguiente:

$uri = 'about/us';
$regex = '~(?<path>[^/]+)/(?<action>.+)~';
var_dump($matches);

que da salida:

array(5) {
  [0]=>
  string(8) "about/us"
  ["path"]=>
  string(5) "about"
  [1]=>
  string(5) "about"
  ["action"]=>
  string(2) "us"
  [2]=>
  string(2) "us"
}

Sin embargo, esto sólo funcionará cuando el componente de trazado sólo va abajo un nivel!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top