Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

criatividade zero

URL router com preg...

Recommended Posts

Regex com várias regras perde um pouco o sentido... Então fiz assim:

Fiz muito na correria, pois preciso sair.. pode conter bugs... mas testa aí..

 

<pre>
<?php
$rule = '/^(\/[a-zA-Z0-9%-]+)(\/[a-zA-Z0-9%-]*)?(\/[a-zA-Z0-9%-]*)?(.html|\/)?$/';

$string = '/categoria/';
preg_match($rule, $string, $x); print_r($x);

$string = '/categoria/artigo-qualquer.html';
preg_match($rule, $string, $x); print_r($x);

$string = '/busca/como%20fazer%20tal%20coisa.html';
preg_match($rule, $string, $x); print_r($x);

$string = '/categoria/tag/esse-termina-antes.html';
preg_match($rule, $string, $x); print_r($x);

Resultado:

Array

(

[0] => /categoria/

[1] => /categoria

[2] => /

)

Array

(

[0] => /categoria/artigo-qualquer.html

[1] => /categoria

[2] => /artigo-qualquer

[3] =>

[4] => .html

)

Array

(

[0] => /busca/como%20fazer%20tal%20coisa.html

[1] => /busca

[2] => /como%20fazer%20tal%20coisa

[3] =>

[4] => .html

)

Array

(

[0] => /categoria/tag/esse-termina-antes.html

[1] => /categoria

[2] => /tag

[3] => /esse-termina-antes

[4] => .html

)

 

O resto dá pra tratar com condições do PHP...

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Regex com várias regras perde um pouco o sentido...

 

mas usando preg_replace teria um array com as possiveis regras, não seria melhor do que ter varias preg_match individuais para percorrer cada situação?

 

com preg_replace ela mesmo perrcorre os indices da array sem precisar loop ou if's

nao seria uma possibilidade?

Compartilhar este post


Link para o post
Compartilhar em outros sites

preg_match no seu caso é melhor... você terá mais dados à disposição, e poderá filtrá-los conforme for conveniente.

Fazer quatro regras é muito antiprodutivo, sem contar na perda de performance.

 

<?php

switch trim($x[1], '/') {
case '':
case 'index':
case 'home':
case 'default':
	$pagina = 'index'; //se qualquer uma das opcoes acima, define a pagina do user como index e desconsidera o resto da url
	break;
case 'tag':
	$pagina = 'tag';
	$parametro = trim($x[3], '/');
	break;
case 'busca':
case 'procura':
case 'search':
case 'find':
	$pagina = 'busca';
	$parametro = trim($x[2], '/');
	break;
default:
	$pagina = 'artigo';
	$parametro = trim($x[2], '/');
	break;
}

 

É mais ou menos isso.. eu não testei, e provavelmente você terá que alterar as variáveis $x[...]. Vai dando echo nelas e vendo se está correto. O que importa é pegar a ideia...

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

então,

usando preg_replace pensei em capturar o parametro do 'pattern' e incorporar direto no 'replacement'

 

	$replacement = array(
	'categoria&article&param=$1'	, # article
);

$pattern = array(
	'#categoria/([a-zA-Z0-9-]+)#'	, # article
);

preg_replace( $pattern , $replacement , $subject );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, seguindo o padrão que você me passou ali em cima, fiz assim:

<?php
$pattern = '/^\/categoria\/?(tag\/[a-zA-Z0-9%_-]+|busca|$|[a-zA-Z0-9%_-]+).*/';

$string = '/categoria/tag/teste-teste.html';//tag
echo preg_replace($pattern, '$1', $string).'<br />';
/* tag/teste-teste */

$string = '/categoria/busca.html';//busca
echo preg_replace($pattern, '$1', $string).'<br />';
/* busca */

$string = '/categoria/';//index com barra
echo preg_replace($pattern, '$1', $string).'<br />';
/* '' */

$string = '/categoria';//index sem barra
echo preg_replace($pattern, '$1', $string).'<br />';
/* '' */

$string = '/categoria/assista-hoje-capitulo-inedito-vale-a-pena-ver-de-novo.html';//artigo
echo preg_replace($pattern, '$1', $string).'<br />';
/* assista-hoje-capitulo-inedito-vale-a-pena-ver-de-novo */

 

O retorno fica em baixo. Nos casos onde é index, retorna uma string vazia.

Resumindo: de qlqr jeito, você terá que usar condições do PHP para tratar. Por esse motivo, eu prefiro preg_match.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas se a array contiver todas as possiveis urls - no caso 4 apenas

 

$pattern = array(
    '#categoria/tag/([a-zA-Z0-9%]+).html#' , #tag
    '#categoria/busca.html#' , # busca
    '#categoria/([a-zA-Z0-9-]+).html#' , # artigo
    '#categoria/#' #index
);

 

$replacement = array(
    '...' #tag
    '...' #busca
    'categoria&artigo&param=$1' , # artigo
    '...' #index
);

 

 

quando o $pattern encontrar no indice da array a url que combina, vai pegar na array $replacement o indice referente com os parametros

 

preg_replace($pattern , $replacement , 'categoria/um-artigo-qualquer.html');

vai retornar: categoria&article&param=$1

 

nao seria isso?

um array de regras e um array com os parametros

Compartilhar este post


Link para o post
Compartilhar em outros sites

E a cada página nova, adiciona-se uma regra e um parâmetro? Perde o sentido de usar ER's.

Eu insisto no preg_match, alguns ifs, e voilá.

 

Mas se você quiser, não há impedimento algum de fazer da forma sugerida...

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

E a cada página nova, adiciona-se uma regra e um parâmetro? Perde o sentido de usar ER's.

Eu insisto no preg_match, alguns ifs, e voilá.

 

mas com preg_match, quando uma nova página for criada, tb teria que incluir um novo if verificador

 

com preg_replace quando cair na condição, retorna montado os valores e parametos

achei mais facil, talvez por não entender muito bem ER's, e por manter todas as regras agrupadas

:)

 

vou testar item por item com preg_match e seus devidos ifs

mais uma duvida ainda não encontrei solução

como passar apenas caracteres com acento?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.