How to separate tags from a variable in PHP array

5

I want to separate tags in a array in PHP, but I could not find an efficient way yet.

I want to turn this:

$variavel="<div><div>texto1<a>texto2</a><b>texto3</b></div>texto4</div>";

in

$array[0]="texto1";
$array[1]="texto2";
$array[2]="texto3";
$array[3]="texto4";

And so on, that is, I want to have the text captured in a site, in several arrays , so I can handle it 1 to 1.

    
asked by anonymous 13.06.2017 / 17:23

2 answers

2

As discussed, the best way to handle HTML text in PHP is to use the DOMDocument . You can load an HTML page into a DOMDocument object as follows:

$dom = new DOMDocument();
$dom->loadHTML($html);

Being $html the contents of the file to be parsed. Since it is only desired to obtain the contents of the body of the file, we can obtain the node referring to body as follows:

$body = $dom->getElementsByTagName("body")->item(0);

Being $body an object DOMNode . You can verify that the element has child elements by using the hasChildNodes method and traverses them using the childNodes attribute. This way, we can create a recursive function that extracts the text from all nodes of the page:

/**
 * Obtém o texto presente em um arquivo HTML, retornando-o em forma de lista.
 * 
 * @param DOMNode $element Elemento de onde será extraído o texto.
 * @param array   $texts   Lista de textos previamente obtidos.
 * @return array Lista de textos obtidos no elemento.
 */
function getTextsOfElements(DOMNode $element, array $texts = [])
{
    // Verifica se o elemento possui elementos filhos:
    if ($element->hasChildNodes()) {
        // Sim, então percorre todos os elementos filhos de forma recursiva:
        foreach ($element->childNodes as $e) {
            // Obtém os textos dos elementos filhos:
            $texts = getTextsOfElements($e, $texts);
        }
    } else {
        // Não, então verifica se o elemento é um texto:
        if ($element->nodeType == 3) {
            // Sim, remove os espaços em branco:
            $text = trim($element->nodeValue);

            // Verifica se o texto não é vazio:
            if ($text) {
                // Sim, então adiciona o texto à lista:
                $texts[] = $text;
            }
        }
    }

    // Retorna a lista de textos:
    return $texts;
}

So, to get the list of texts, just call the function passing the object $body as a parameter:

print_r(getTextsOfElements($body));

If the entry is the one specified in the question (complete HTML):

$html = '<html>
            <head>
                <meta charset="UTF-8">
                <title>Document</title>
            </head>
            <body>
                <div>
                    <div>
                        texto1
                        <a>texto2</a>
                        <b>texto3</b>
                    </div>
                    texto4
                </div>
            </body>
        </html>';

The output will be:

Array
(
    [0] => texto1
    [1] => texto2
    [2] => texto3
    [3] => texto4
)
  

See working at Repl.it .

    
14.06.2017 / 00:15
1

The reasoning would basically be to create a function that can replace all HTML tags with a generic tag, so let's call it, and use the explode command to turn this string into an array. This will probably create many empty indexes in the array, so we will use the array_filter function to clear it. A practical example:

<?php
    function remover_vazio($array) {
        return array_filter($array, '_remover_vazio_interno');
    }

    function _remover_vazio_interno($value) {
        return !empty($value) || $value === 0;
    }

    function separaTextoDoHTML($variavel) {
        // Substitui todas as tags HTML por uma tag única
        $variavel = preg_replace('#<[^>]+>#', '<HTML>', $variavel);

        // Realiza um explode com base na tag única criada, viabilizando separar em um array
        $array = explode('<HTML>', $variavel);

        // Utiliza uma função para filtrar o array e tirar os possíveis indices vazios
        $array = remover_vazio($array);

        // Criar array auxiliar para reordenar
        $arrayAux = array();

        // Percorre o array transferindo para os índices na ordem            
        foreach ($array as $value) {
            $arrayAux[] = $value;
        }

        // Retorna valor
        return $arrayAux;
    }
?>

The function code separatesHTMLText is commented out for more purpose, but the process is to receive a variable, perform preg_replace , to create a single item that can make the% . This will generate empty indexes and use the remove_vazio function to clear the array. An example use would be:

// Valor informado na pergunta
$variavel = '<div><div>texto1<a>texto2</a><b>texto3</b></div>texto4</div>';

// Chamada da função criada
$retorno = separaTextoDoHTML($variavel);

// Dump da variável retornada para checar seu valor
var_dump($retorno);

This will print on the screen:

array (size=4)
  0 => string 'texto1' (length=6)
  1 => string 'texto2' (length=6)
  2 => string 'texto3' (length=6)
  3 => string 'texto4' (length=6)
    
13.06.2017 / 21:28