Regular expression to filter the first paragraph between tags using PHP

Asked

Viewed 474 times

1

I need to extract the first paragraph of an HTML code using Regular Expressions.

The Goal: To get only the content highlighted in green: O Objetivo é pegar apenas o texto conforme a imagem

HTML code

<div class="text">                          <p><span style="font-size:16px">As notas do Exame Nacional do Ensino Médio (Enem) 2017 foram divulgadas nesta quinta-feira (18). O resultado deve ser consultado individualmente: para isso, os candidatos devem acessar a Página do Participante (https://enem.inep.gov.br/participante/) e incluir CPF e a senha cadastrada. </span></p>    <p><span style="font-size:16px">O resultado dos treineiros só será divulgado em 19 de março. Na mesma data, o Ministério da Educação também vai disponibilizar os chamados "espelhos da redação", que são a cópia digitalizada dos textos e as justificativas para as notas. </span></p>    <p><span style="font-size:16px">Nesta quinta, o Ministério da Educação (MEC) divulgou o balanço sobre o desempenho dos candidatos na edição de 2017 do exame. Apenas 53 alunos tiraram nota mil na redação, porém a nota média subiu de 541,9 para 558. Neste ano, os candidatos escreveram sobre o tema "Desafios para a formação educacional de surdos no Brasil".</span></p>    <p><span style="font-size:16px">Com a nota do Enem 2017, os estudantes podem concorrer a uma vaga em uma universidade pública que tenha aderido ao Sistema de Seleção Unificada (Sisu) 2018. As vagas já podem ser consultadas. Serão 130 instituições no Brasil - 30 estaduais e 100 federais -, que ofertarão 239.601 vagas na graduação.</span></p> 

I’m trying to filter in PHP with preg_match_all

$filtroregex = "/<p><span style=\"font\-size:16px\">(.*?)<\/span><\/p>/s"; 
preg_match_all($filtroregex, $htmlcode, $resultado);
echo $resultado[1][0];

But it’s always returning every paragraph.

  • 1

    Has used var_dump($resultado); to get answers? Have you thought about using XPath or DOMDocument ?

  • var_dump Yes, then I have this last filter that is to take the first paragraph. Analyze the Regex here

2 answers

1

After much research on Regex

I found the solution

/<p><span style=\"font\-size:16px\">(.*?)<\/span><\/p>/s

check here

1

If the content you are looking for is not from a page rendered by a template engine or pre-processed by JS, this code can help you.

<?php  
$curl = curl_init();  
$url = "http://suapagina.html";  
curl_setopt_array($curl, [  
    CURLOPT_URL => $url,  
    CURLOPT_RETURNTRANSFER => true,
]);  

// Pega o conteudo da pagina HTML  
$response = curl_exec($curl);  

// Pega as mensagens de erro  
$err = [  
    'curl_error' => [  
        'error_code'    => curl_errno($curl),  
        'erro_message'  => curl_error($curl)  
    ]  
];  

$dom = new DOMDocument();  
libxml_use_internal_errors(true);  

// Carrega o conteudo da pagina dentro de um objeto  
$dom->loadHTML($response);  

// Descarta os whitespaces    
$dom->preserveWhiteSpace = false;    

// Busca todas as incidencias da tag  
$results = $dom->getElementsByTagName('span');  

// Fecha a conexao  
curl_close($curl);  

foreach($results as $result)  
{  
    echo $result->nodeValue . PHP_EOL;  
}  
  • It didn’t work even by changing some parameters Follows error: Catchable fatal error: Object of class Domelement could not be converted to string in /home/a_dom.php on line 40 (foreach)

  • I changed the code. I had forgotten to put the 'nodeValue' parameter at the time of printing the result. Take a look there.

  • If the tag used has the attribute id defined, you can pick up the content through these commands without having to go through an array: ... &#xA;$results = $dom->getElementById('<VALOR DO PARAMETRO ID>'); &#xA;echo $results->nodeValue;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.