Giihh 6 Denunciar post Postado Novembro 18, 2015 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
Giihh 6 Denunciar post Postado Novembro 19, 2015 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
Beraldo 864 Denunciar post Postado Novembro 19, 2015 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
Giihh 6 Denunciar post Postado Novembro 19, 2015 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
Giihh 6 Denunciar post Postado Novembro 19, 2015 preg_replace_callback_array serve nesse caso? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Novembro 19, 2015 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
Giihh 6 Denunciar post Postado Novembro 19, 2015 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
Giihh 6 Denunciar post Postado Novembro 20, 2015 finalmente consegui resolver utilizando diversos ERs em preg_replaces Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Novembro 20, 2015 Poste a sua solução, pode ser importante para alguém no futuro. Compartilhar este post Link para o post Compartilhar em outros sites