Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal!
Tenho uma situação onde preciso adicionar um FLAG se o usuário estiver incluindo um link em sua mensagem para que eu possa filtra-la ou não.
Se estiver incluindo um link, preciso checar se esse link está autorizado. Se sim, adiciono um FLAG false, se não, true.
Com links absolutos, isso é simples de ser feito e já tenho feito:
<?php
$regex = "(((https?|ftp):\/\/)?(bit)?([a-z0-9+!*(),;?&=.-]+(:[a-z0-9+!*(),;?&=.-]+)?@)?([a-z0-9\-\.]*)\.(([a-z]{2,4})|([0-9]{1,3}\.([0-9]{1,3})\.([0-9]{1,3})))(:[0-9]{2,5})?(\/([a-z0-9+%-]\.?)+)*\/?(\?[a-z+&$_.-][a-z0-9;:@&%=+/.-]*)?(#[a-z_.-][a-z0-9+$%_.-]*)?)";
$linksAutorizados = ['bit.ly/123'];
$mensagem = [ 'usuario' => 'teste', 'texto' => 'seja bem vindo ao meu site bit.ly/123' ];
$temLink = preg_match ($regex, $mensagem['texto'], $links);
/**
* $links retorna o seguinte array
* 0: "bit.ly/123"
* 3: "bit"
* 7: "ly"
* 8: "ly"
* 13: "/123"
* 14: "3"
*/
if ($temLink) {
/*
* Checo se link da mensagem é igual ao link da lista de linksAutorizados.
* Se o link da mensagem for igual ao link da lista a mensagem não precisa ser filtrada
* Se o link da mensagem for diferente ao link da lista, a mensagem precisa ser filtrada
*/
if ($links[0] == $linksAutorizados[0]) {
$mensagem += [ 'filtrar' => false ];
} else {
$mensagem += [ 'filtrar' => true ];
}
} else {
/*
* Se não encontrar link na mensagem, ela não precisa ser filtrada
*/
$mensagem += [ 'filtrar' => false ];
}
*Obs: O acesso aos arrays foi em hardcoded para uma exemplificação mais clara.*
**O meu problema é:**
E se eu quiser liberar links variáveis, ou seja, não importa o subdomínio ou demais parâmetros de querystring, checar somente o dominio
**Por exemplo**
*.meusite.com.br
meusite.com.br/*
subdominio.meusite.com.br/*
**Exemplo de array com links (que podem ser variaveis) autorizados para o usuario:**
$linksAutorizados = ['bit.ly/123', 'goo.gl/*', 'meusite.com.br/*' ];
Onde estão os asteriscos seriam os pontos que eu ignoro da verificação para filtro.
Passei o dia fazendo alguns testes e pesquisando material no Stack mas não encontrei nada.
Desde já muito obrigado por qualquer luz =)>
4 horas atrás, marsolim disse:
strpos() não faz a parada? tipo...
$site = "subdominio.meusite.com.br/teste.php";
$domain = "meusite.com.br";
echo strpos($site, $domain) !== false ? "Autorizado" : "Não autorizado";
vai imprimir "Autorizado".
Boa!!
Gostei da dica/orientação.
**Segue resultado**
<?php
/**
* $userLink = String com o link encontrado no texto
* $links = defino array de links em whitelist para iterar
* $authorizedLinks = Array pego por referencia de uma consulta ao Mysql com lista de links autorizados
* $result = Por padrão já defino como true, mas se o link da mensagem for encontrado na whitelist, então defino para false
*/
$checkWhiteList = function($userLink, array $links = null) use (&$authorizedLinks) {
$links = $authorizedLinks;
$result = true;
foreach($links as $link){
if(strpos($userLink, $link) !== false) {
$result = false;
}
}
return $result;
};
Fiz uma função em closure para poder herdar o array com os links autorizados de outro escopo para não ter que realizar nova consulta ao meu banco de dados, dado que posso ter milhares de mensagens para checar, o que poderia causar sobrecarga ao meu bd.
Dessa forma posso chamar essa função dentro do meu loop de mensagens milhares de vezes com apenas uma consulta a lista de links autorizados do meu banco de dados.
Dessa forma se no meu banco eu tiver o link - *meusite.com.br* - e meu usuário imputar *subdominio.meusite.com.br* | *meusite.com.br/querystring* a função consegue identificar como link dinâmico e então autorizar.
E caso eu queira link absoluto é só ter em meu banco de dados *subdominio.meusite.com.br *e se meu usuario imputar *meusite.com.br *o link será barrado.
Consegui fazer exatamente o que pretendia.
Obrigado!
strpos() não faz a parada? tipo...