Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera... Nessa expressão regular, eu verifico se a string tem link, e transformo ela em uma URL "clicável" html preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?=&-_/]+!', "<a href=\"\\0\">\\0</a>",$msg). Porém, links com acento, e links que no lugar de espaço tem o caractere +, ele "corta" Dicas? Acento e + em links não são comuns, mas to tendo situações que possuem.... vlw
Mto bom Gabriel....
Mas não deu mto certo... veja só
Usando seus dois resultados finais... links com +, ainda não funcionam... ela remove o + da string
preg_replace('!(htt|ft|sc)ps?://\S+!', "<a href=\"\\0\" onclick=\"window.open(this); return false;\">\\0</a>",$msg);
Exemplo de um link que tem + no meio...
http://tecnologia.terra.com.br/noticias/0,,OI603743-EI15608,00-Microsoft+adquire+os+emoticons.html
Realizei o seguinte teste:
$msg = 'algum texto com um link [http://forum.imasters.com.br/topic/534696-+-expressao-+-regular/](http://forum.imasters.com.br/topic/534696-+-expressao-+-regular/) continuando o texto';
$retorno = preg_replace('!(htt|ft|sc)ps?://\S+!', "<a href=\"\\0\" onclick=\"window.open(this); return false;\">\\0</a>",$msg);
var_dump($retorno);
Adicionei '+' ao link, e obtive o seguinte resultado:
string 'algum texto com um link <a href="http://forum.imasters.com.br/topic/534696-+-expressao-+-regular/" onclick="window.open(this); return false;">http://forum.imasters.com.br/topic/534696-+-expressao-+-regular/</a> continuando o texto' (length=230)
Gabriel, era burrada minha, no meu banco não estava gravando o +... ai logicamente deu o problema
Funcionou perfeitamente...
Aproveitando o tópico... saberias me dizer se é possível fazer o seguinte com expressão regular
tenho os caminhos
\\servidor\pasta\cliente\2015\job\
tb tenho
z:\pasta\cliente\2015\job\
Estes caminhos, tb virarem link como na situação acima...
Valeuu =)
Expressões regulares são usadas para encontrar padrões. Você deve separar os padrões que você quer encontrar e substituir.
O problema é quando um padrão afeta outro, como seus caminhos de pastas (do primeiro exemplo) serem confundidos com padrões de namespace em um texto. Caso seja o contexto do texto, pode ocorrer.
sua situação ocorre aqui:
'[a-zA-Z0-9.?=&-_/]'
apenas amplie-a para casar os caracteres desejados. Você também pode ismplificar algumas coisas
Por exemplo, isso:
'\w'
é igual a isso:
'[A-Za-z0-9_]'
Outro ponto, são os intervalos, pois sua expressão está possuindo um intervalo que eu acredio que não seja intencional:
que é este:
'[&-_]'
O hífen deve sempre ser escapado.
As vezes, é mais fácil pensar ao contrário. Ao invés de usar o que deve ter em um link, o que você usa para definir que um link chegou ao fim?
Se for espaços em branco, utilize da seguinte forma:
'(http|ftp|scp)(s)?://\S+'
Essa ER procurará tudo que iniciar com algum protocolo, seguido de dois pontos, seguido de barra, seguido de barra (novamente) e seguido de qualquer coisa que não seja um espaço em branco.
As barras não necessitam ser escapadas quando não estão dentro de conjuntos.
Simplificando ainda mais, teria esse resultado:
'(htt|ft|sc)ps?://\S+'