Ir para conteúdo

POWERED BY:

Arquivado

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

Tsubaru

Expressão regular para remover texto entre delimitadores

Recommended Posts

Pessoas, venho pedir um help aqui, pois estou a manhã inteira tentando fazer isso e não consigo. Expressões regulares sempre deram um nó nos meus miolos.

Já pesquisei no google, li trocentos tutoriais, até consigo fazer coisas simples, mas isso aqui não funcionando.

 

O que eu quero fazer é remover seja lá o que estiver entre determinados delimitadores. Sejam os delimitadores, um texto ou um caracter.

 

Por exemplo:

 

<p>Título</p>

 

Eu quero uma expressão que diga que tudo que estiver entre

<p> e </p>

, será apagado, inclusive

<p> e </p>

.

 

 

Eu encontrei esse código na web:

$string = preg_replace("'<[^>]+>'U", "", $string);

 

Já alterei isso de todas as formas possíveis, mas nada funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esses delimitadores são sempre tags HTML?

 

Se sim, a melhor maneira de fazer isso não é usando expressões regulares, mas um parser para pegar o conteúdo de determinada tag em um documento extruturado (HTML, XML, etc.)

 

Se for XML, use DOMDocument.

 

Se for HTML, eu recomendo a excelente classe: Simple HTML DOM.

 

Com ela você pode pegar o conteúdo de uma tag simplesmente usando, por exemplo:

$content = "<p>Título</p><p>Título 2</p>";

$html = file_get_str($content);

// Pega todos os paragrafos
foreach($html->find('p') as $element) 
      echo $element->innertext . '<br>';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou dar uma olhada nessa classe, valeu.

 

Olha o gatilho que eu fiz:

$texto = str_replace(array('<p>','</p>'),array('%','#'),$texto);
$texto = preg_replace("'%[^#]+#'U", "", $texto);

 

:grin:

 

 

Eu tenho uma função que achei na internet uns tempos atrás, mas achei que teria uma forma mais prática/otimizada de fazer isso com regex.

 

function retornaParte($texto, $entrada, $saida, $debug=false) {
	$posLeft=strpos($texto, $entrada);
	if ( $posLeft===false ) {
		if ( $debug ) {
			echo "Alerta: delimitador de entrada |'{$entrada}'| não encontrado";
		}
		return false;
	}
	$posLeft+=strlen($entrada);
	$posRight=strpos($texto, $saida, $posLeft);
	if ( $posRight===false ) {
		if ( $debug ) {
			echo "Alerta: delimitador de saída |'{$saida}'| não encontrado";
		}
		return false;
	}
	return trim(substr($texto, $posLeft, $posRight-$posLeft));
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

:seta: http://php.net/manua....strip-tags.php

 

<?php
$content = '<p>Título</p>';

echo strip_tags($content);

 

Saída: Título

 

<?php
$content = '<p>Título</p> <strong>Isso deve ficar</strong>';

echo strip_tags($content, '<strong>');

 

Saída: Título <strong>Isso deve ficar</strong>

Compartilhar este post


Link para o post
Compartilhar em outros sites

João, eu uso strip_tags, mas o que precisava fazer nesse caso é evitar que o strip_tags sumisse com imagens e links. Uso essa gambiarra que fiz antes, depois o strip_tags, aí consigo o resultado que queria. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia o manual, você verá que strip_tags possui um segundo parâmetro que permite que você especifique as tags que deseja permitir:

 

<?php
$content = '<p>Um parágrafo com um <a href="#">link dentro</a> e uma <img src="http://forum.imasters.com.br/public/style_images/imasters-2011/imasters-forum-logo.png" alt="imagem" /> dentro</p>';

echo strip_tags($content, '<img><a>');

 

Saída:

Um parágrafo com um <a href="#">link dentro</a> e uma <img src="http://forum.imasters.com.br/public/style_images/imasters-2011/imasters-forum-logo.png" alt="imagem" /> dentro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu, João.

O interessante seria mesmo se desse pra fazer o contrário, tipo, especificar o que você não quer que o strip_tags remova. ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites
especificar o que você não quer que o strip_tags remova. ^_^

mas é exatamente isso que o segundo parâmetro faz.

 

permitir == não remover.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estou usando algo desse tipo:

 

$texto ="<title>texto que desejo sem formatação</title>";
$search = array('@<title[^>]*?>@si');
$texto_limpo = strip_tags(preg_replace($search, '', $texto));
print $texto_limpo ."<p>";

 

É um pequeno exemplo que pode lhe dar uma luz no que deseja fazer

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.