Ir para conteúdo

POWERED BY:

Arquivado

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

Giihh

Preg_replace - condição de alteração

Recommended Posts

Olá,

 

Com faço para dentro do preg_replace antes de alterar fazer uma verificação?

preg_match_all("/<h[1-6].*?>(.+?)<\/h[1-6]>/i", $contents, $resultado);
$matches = implode("\n",$resultado[0]);
$matches = preg_replace('/<h([1-2])>/','<li>',$matches);
$matches = preg_replace('/<\/h[1-2]>/','</li>',$matches);

onde esta <li>, gostaria de verificar se a proxima tag de titulo é um <h3>, se for insere <ol><li><h3>

se o proximo titulo é <h3> novamente insere fechamento </h3></li> mas quando identificar o próximo é um <h2> fecha a tag <ol> ficando </h3></li></ol>

 

Na verdade a duvida é mais como fazer a função de verificação.

 

O Beraldo deu uma dica de como usar o preg_replace_callback, pensei em algo assim:

$matches = preg_replace_callback(
    "/<h([1-2])>/",
    function ($matches)
    {
        aqui criar a função de verificação pra antever a proxima tag de titulo
    },
    $matches);

Agradeço ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma ajuda pra ver onde estou errando?

/* primeiro procura onde tem fechamento</h2> com proxima tag de abertura de titulo <h3> e 
subtitui o </h2> por </a></li></strong> e
subtitui a tag de abertura <h3> por tags de abertura <ol><li>			
*/

$matches = preg_replace_callback(									"/(<\/h2>)(.*?)(<h3>)/i",									function ($matches)										{
	   $h2 = str_replace('</h2>', '</a></li></strong>', $matches[1]);
	   $h3 = str_replace('<h3>', '<ol><li>', $matches[3]);
	   return sprintf("%s %s %s",  $h2, $matches[2], $h3);
	},
	$matches);

/* depois procura onde tem </h3> com proxima tag de abertura de titulo <h2> e 
subtitui o </h3> por </a></li>
e depois subtitui a tag de abertura <h2> pelas tags </ol><li>			
*/

$matches = preg_replace_callback(
	"/(<\/h3>)(.*?)(<h2>)/i",
	function ($matches)
		{
		$h3 = str_replace('</h3>', '</a></li>', $matches[1]);
		$h2 = str_replace('<h2>', '</ol><li>', $matches[3]);
		return sprintf("%s %s %s", $h3, $matches[2], $h2);
		},											$matches);

Conforme a pagina do manual php, que o Beraldo passou: http://php.net/sprintf, achei que o mais apropriado é o:

s - O argumento é tratado e mostrado como uma string.

mas acho que estou errando ai, não mostra nenhum erro, mas também não ocorre nenhuma alteração relacionada aos dois preg_replace_callback, somente outras alterações. As alterações com str_replace que vem antes e depois do preg_replace_callback funcionam normal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

preg_replace não vai te ajudar muito nesse caso. Isso por que, dentro do callback, você só tem acesso à string casada pela ER. Não tem como acessar a string após ela.

 

Você quer fazer algo parecido com um parser, o que um compilador faz. Existe um termo chamado lookahead, que é mais ou menos o que você precisa.

 

Mas dá pra pegar um caminho mais simples.

 

Usando preg_match_all, você pode pegar todos os cabeçalhos (h1 até h6). Com eles, monte um array multidimensional, formando uma árvore. Algo neste estrutura

 

 

[
    h1 =>
         [
             h2 => 
                 [
                      h3
                  ],
             h2 
             ....
         ]
]

 

Depois percorra o array e insira as tags, conforme houver elementos dentro de cada cabeçalho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas esta certo essa parte?

return sprintf("%s %s %s", $h3, $matches[2], $h2); 

conteudo $h3 = </a></li>

Conteudo $matches[2] = (.*?)

conteudo $h2 = </ol><li>

 

"%s %s %s" é isso mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas esta certo essa parte?

return sprintf("%s %s %s", $h3, $matches[2], $h2); 

conteudo $h3 = </a></li>

Conteudo $matches[2] = (.*?)

conteudo $h2 = </ol><li>

 

"%s %s %s" é isso mesmo?

%s é sempre pra string.

Você tem 3 string, então está correto

 

 

preg_replace_callback_array

 

serve nesse caso?

essa função só existe no PHP 7

e pro seu caso não resolve. Ela equivale a diversas chamadas de preg_replace_callback

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei fazer o array como você mencionou ou por onde começar :mellow: . Sobre essa parte que você falou:

 

preg_replace não vai te ajudar muito nesse caso. Isso por que, dentro do callback, você só tem acesso à string casada pela ER. Não tem como acessar a string após ela.

 

quando coloquei

"/(\/h3>)(.*?)(<h2>)/i",

entendi assim: "procure onde tem </h3> qualquer conteudo seguido de <h2>". Então entendi que os trechos que quero substituir estão dentro da string casada não após ela.

 

Não entendi pq não funcionou, se a alteração que solicitei esta dentro da string casada pela ER

		$h3 = str_replace('</h3>', '</a></li>', $matches[1]);
		$h2 = str_replace('<h2>', '</ol><li>', $matches[3]); 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste a sua solução, pode ser importante para alguém no futuro.

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.