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

'categoria/' /*index*/

'categoria/tag/uma-tag.html' /*tags*/

'categoria/busca.html' /*busca*/

'categoria/texto-qualquer.html' /*texto*/

 

cada categoria tem seu config-router com as URLs aceitas - acima

como é possivel identificar essas URLs com preg_match e definir cada caso?

 

 

no HTACCESS é mole

RewriteRule ^categoria/([a-zA-Z0-9-]+).html texto.php?link=$1

mas queria jogar essa parte para o php

 

tem como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

<pre>
<?php
$string = '/categoria/teste/asdadas/pegaisso/sadas.html';
preg_match('/categoria(\/?([a-zA-Z0-9_-]+))*.html/', $string, $resultado);
echo $resultadop[2];//retorna 'sadas'

 

A ideia é trocar $string pelo $_SERVER['REQUEST_URI']. Não adiantei isso, pois não teria como testar aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

testei assim:

$string = '/categoria/sadas.html';

 

output:

Array

(

[0] => categoria/sadas.html

[1] => /sadas

[2] => sadas

)

 

nao entendo nada mesmo de ER

pq no indice 1 ele fica com a barra '/sadas'?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq tem dois grupos... eu optei por fazer 2 índices, senão você teria que remover a barra 'na unha', com ltrim, substr, explode, etc...

Pode usar o índice 2, que a princípio você não terá problemas. Apenas faça alguns testes em cima, pois só testei com o exemplo que postei acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A vantagem é a flexibilidade. No seu caso, daria para fazer assim tb:

 

<?php
$string = explode('/', $_SERVER['REQUEST_URI']);
echo $string = strstr(end($string), '.', true);

 

Não testei, mas é pra retornar o mesmo resultado.

Todos falam da perda de performance entre essas funções e REGEX. Mas usar essas três funções, não acho que faria uma diferença significativa. Então a flexibilidade faz valer a pena. Para editar mais tarde, basta reler a regex e mudar conforme conveniente. Isso é mais questão pessoal mesmo.

 

Se quiser fazer um pequeno benchmark em cima das duas soluções e postar aqui, ajudaria a decidirmos :).

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

o bench ate posso fazer mais tarde

 

estava vendo como os FW trabalham com as rotas de URL, ai me deparei com as PREGs

os que vi fazem alguns laços pra destrinchar a URL

 

 

no HTACCESS essas ERs vão direto à pagina

1. 'categoria/'

2. 'categoria/tag/uma-tag.html'

3. 'categoria/busca.html'

4. 'categoria/texto-qualquer.html'

 

algum PREG consegue se aproximar ao HTACCESS nesse ponto?

uma URL www.site.com.br/carro.html, seria interpretada pela PREG como o caso 1 (index da categoria)

uma URL www.site.com.br/carro/tag/fuca.html, seria interpretada pela PREG como o caso 2 (tags)

 

é possivel?

Compartilhar este post


Link para o post
Compartilhar em outros sites

<pre>
<?php
$string = '/categoria/teste/asdadas/pegaisso/sadas.html';
preg_match_all('/(\/?([a-zA-Z0-9_-]+))/', $string, $resultado);
print_r($resultado[2]);
/**
* Retorno:
* Array
* (
*     [0] => categoria
*     [1] => teste
*     [2] => asdadas
*     [3] => pegaisso
*     [4] => sadas
*     [5] => html
* )
*/
$ultimo = array_pop($resultado[2]);
echo '<br />http://www.site.com.br/' . implode ('/', $resultado[2]) . '.' . $ultimo;
/**
* Retorno:
* http://www.site.com.br/categoria/teste/asdadas/pegaisso/sadas.html
*/

 

É mais ou menos isso... agora você tem todas as tags separadas... :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

não é possivel

só isso?

[risos]

 

 

indice [0] corresponde ao controller

indice [1] corresponde à ação

indice [2+] correspondem aos parâmetros

ficou facil demais :)

 

 

na teoria vou pegar o [0] e carregar o arquivo config pertinente à categoria

no arquivo config tenho uma lista de criterios para validar as regras da URL

da pra usar array_combine e fazer uma brincadeira bacana completando a router com o controller, ação e parâmetros

 

 

como não sei nada de ER, tenho receio de algum 'bug' ou criterio invalido passar

essa regra

preg_match_all('/(\/?([a-zA-Z0-9_-]+))/', $string, $resultado);

pode dar furo?

 

 

valeu fera

 

----

edit

----

 

4. 'categoria/texto-qualquer.html'

deu pau pra capturar essa parte

to tentando ver se arrumo

Compartilhar este post


Link para o post
Compartilhar em outros sites
pode dar furo?

Se a string mantiver o padrão do $_SERVER['REQUEST_URI'], não tem erro.

Caso fosse o domínio completo, por exemplo, funcionaria, porém mudaria a ordem dos dados, e poderia bugar no teu sistema, pq casaria também 'http', 'www', 'dominio', 'com', 'br'...

 

Legal que resolveu... apenas veja se explode('/') não seria melhor, pois do jeito que ficou, a única grande vantagem é a segurança, pois ele só vai casar as tags que tiverem somente "a-zA-Z0-9_-", isso significa que o cara nunca iria conseguir fazer um injection ali.

 

[]'s

 

edit:

 

4. 'categoria/texto-qualquer.html'

deu pau pra capturar essa parte

<pre>
<?php
$string = '/categoria/teste/asdadas/pegaisso/aqui-tem-hifen.html';
preg_match_all('/(\/?([a-zA-Z0-9_-]+))/', $string, $resultado);
print_r($resultado[2]);

$ultimo = array_pop($resultado[2]);
echo '<br />http://www.site.com.br/' . implode ('/', $resultado[2]) . '.' . $ultimo;

Retorno:

Array
(
   [0] => categoria
   [1] => teste
   [2] => asdadas
   [3] => pegaisso
   [4] => aqui-tem-hifen
   [5] => html
)

http://www.site.com.br/categoria/teste/asdadas/pegaisso/aqui-tem-hifen.html

 

Era pra funcionar aí tb...

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas funcionou... me expressei errado

 

'categoria/texto-qualquer.html'

foi dividido numa boa

Array

(

[0] => categoria

[1] => texto-qualquer

)

 

2. 'categoria/tag/uma-tag.html'

3. 'categoria/busca.html'

as outras entradas possuiem a definição clara da ação:

Tag-> palavra

Busca-> termo

 

nesse caso não possui uma referencia de que se trata de um artigo

se fosse Artigo-> titulo seria simples

vou ter que implementar uma verificação nesse caso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma dica... veja o link desse tópico:

 

http://forum.imasters.com.br/topic/434769-url-router-com-preg/

 

Tá vendo o 434769? É o id do tópico... Então mesmo que alguem acesse:

 

http://forum.imasters.com.br/topic/434769-criatividade-zero

 

Vai acessar o mesmo tópico...

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

é, mas ai tem a referencia explicita

http://forum.imasters.com.br/[b]topic[/b]/434769-criatividade-zero

 

no meu caso não ha referencia de que é um artigo

www.site.com.br/categoria/titulo-do-texto.html

www.site.com.br/categoria/busca.html?q=palavra-buscada

www.site.com.br/categoria/tag/uma-tag-qualquer.html

 

na regra no HTACCESS cai como excessão

se a URL não for capturada no 1º nem no 2º caso, entra automaticamente como uma pagina de artigo

/*busca*/

RewriteRule ^categoria/busca.html

/*tag*/

RewriteRule ^categoria/tag/([a-zA-Z-]+).html

/*artigo*/

RewriteRule ^categoria/([a-zA-Z0-9-]+).html

 

 

-----

 

o preg_match_all funciona com array?

preg_match_all(array(...), $string, $resultado);

 

sei que o preg_replace trabalha com array tb, mas nao encontrei referencia sobre preg_match_all

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas eu estava me referindo à você passar os dados já num padrão, ex:

 

site.com.br/3-43-um-artigo-qualquer

3 = artigos
43 = id do artigo

 

o preg_match_all funciona com array?

Não, somente string:

int preg_match_all ( string $pattern , string $subject , array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]] )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas eu estava me referindo à você passar os dados já num padrão, ex:

deixei isso por conta do HTACCESS para focar na acessibilidade

 

 

vou fazer uns testes com preg_replace e as regras

se jogar as regras no $pattern, e as referencias no $subject pode ser que funcione

vou testar mais tarde :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como o Matheus Tavares falou, não dá para usar array.

 

Mas você pode fazer um 'monstrinho'. :P

<?php

$patterns = array( 
'/pattern 1/',
'/pattern 2/',
'/pattern 3/',
'/pattern 4/'
);

$subject = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';

array_walk( $patterns, 
function( $pattern ) use ( $subject, &$matches )
{
	preg_match_all( $pattern, $subject, $matches[] );
} );

var_dump( $matches );

?>

 

Realmente não sei se vale a pena :ermm:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matheus,

obrigado pela explicação, sua ER vai ser util em outra aplicação

 

www.site.com.br/categoria/titulo-do-texto.html

como essa url nao possui uma regra explicita, a unica forma que encontrei foi com preg_replace

depois vou testar mais a fundo e posto o resultado

Compartilhar este post


Link para o post
Compartilhar em outros sites

essas regras são válidas para usar no preg_replace?

preciso dessa info, pq ainda nao saco essas regras

 

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

 

[]s

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.