Retrieve data in PHP within a text

3

I have the following text:

$texto = "Olá {cliente}, seja bem vindo ao site {site}!
Aqui você terá acesso as seguintes opções:
{opcoes}

Estes dados foram gerados automaticamente em {data}
Pela empresa {empresa}";

Note that we have several tags between the keys, I need to compile a PHP that retrieves only these tags, and place them inside a array() , because I will include the tags in a different table.

How can I recover only those within the keys?

The result I'd like would be:

Array (
      [0] => {x},
      [1] => {y}
)
    
asked by anonymous 26.08.2016 / 15:48

2 answers

5

You can do this:

$texto = "Olá {cliente}, seja bem vindo ao site {site}!
Aqui você terá acesso as seguintes opções:
{opcoes}

Estes dados foram gerados automaticamente em {data}
Pela empresa {empresa}";

preg_match_all('/\{(.*?)\}/', $texto, $match);
print_r($match[0]); // Array ( [0] => {cliente} [1] => {site} [2] => {opcoes} [3] => {data} [4] => {empresa} )

It also works like this:

preg_match_all('#\{(.*?)\}#', $texto, $match);

Note that so each value of $match[0] has the "{...}" included, if you do not want it you can access index 1:

print_r($match[1]); // Array ( [0] => cliente [1] => site [2] => opcoes [3] => data [4] => empresa ) 
    
26.08.2016 / 15:54
1

Miguel answered very well the question, just follow another alternative using the strpos and substr :

function recuperarTags($texto){
    $inicio = 0;
    $tags = [];

    while (($inicio = strpos($texto, "{", $inicio)) !== false) {
        $final = strpos($texto, '}', $inicio + 1);
        $tamanho = $final - $inicio;
        $tag = substr($texto, $inicio + 1, $tamanho - 1);

        $tags[] = $tag;
        $inicio += 1;
    }
    return $tags;
}

To use, do so:

$texto = "Olá {cliente}, seja bem vindo ao site {site}!
Aqui você terá acesso as seguintes opções:
{opcoes}

Estes dados foram gerados automaticamente em {data}
Pela empresa {empresa}";

$tags = recuperarTags($texto);

foreach ($tags as $tag) {
    echo $tag ."\n";
}

See DEMO

    
26.08.2016 / 16:28