Ir para conteúdo

Arquivado

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

Jin Freaks

expressão regular

Recommended Posts

Boa noite.

Eu ainda sou iniciante em PHP, mas estive lendo uns códigos e tentando implementá-los de outra forma ultimamente. Trata-se de um BBS simples (uma página php onde se pode escrever mensagens e elas serão armazenadas em um arquivo de log para então ser carregada como html).

No caso, como a mensagem vai ser exibida em html, então é possível colocar imagens colocando tags, por exemplo.

 

E aí que entra o conflito. No código-fonte, sempre que há um link (http://www. ...), ele será convertido em hiperlink (ou seja, <a href="http://www...."></a>) e isso é feito através deste código de expressão regular:

$proto = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$proto);

,onde $proto é a mensagem.

 

Mas desse jeito, não é possível postar imagens (tag <img>) porque o link dela seria convertido pra tag <a>.

 

Alguém saberia me dizer se ou como seria possível, com esse modelo, criar um jeito de que só vire hiperlink quando não houver a tag <img src="http://www...></img> ?

 

Eu tenho pesquisado bastante a respeito, tentei usar o método de negação de classe (?) adicionando [^\<img src] e [^\</img\>] no ereg_replace, mas não funciona de jeito nenhum.

 

Resolvi postar aqui porque realmente não consegui achar nenhuma solução.

 

Obrigado.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa ler o DOM e trabalhar apenas com o valor dos elementos.

 

O PHP possui DOMDocument (php.net/DOMDocument)

$dom = new DOMDocument;

libxml_use_internal_errors(true); 
$dom->preserveWhiteSpace = false; 

// Como você disse que a mensagem está contida em "$proto"
$dom->loadHTML($proto);

libxml_clear_errors();
$dom->formatOutput = true;

// Ler todos os elementos
$elements = $dom->getElementsByTagName('*');

if ($elements->length) {

    // Percorremos os elementos
    foreach ($elements as $el) {
        // $el->nodeValue 

Dessa forma você ler apenas o texto em "$el->nodeValue" e evita atributos e tags.

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.