Capturar conteúdo entre aspas em uma string

1,146 views
Skip to first unread message

Ítalo Barboza

unread,
Sep 15, 2008, 12:25:48 PM9/15/08
to list...@googlegroups.com
Boa tarde, pessoal. É o seguinte, eu possuo a string: a:3:{i:0;s:2:"en";i:1;s:2:"fr";i:2;s:2:"pt";}
Estou fazendo uma função para capturar o conteudo entre aspas desta string, no caso deveria retornar en, fr e pt. Eu já consegui, e quero saber qual a solução mais profissional.
A minha solução [alternativa] foi dar um explode na string com aspas e exibir as ocorrências ímpares.
$registro = "a:3:{i:0;s:2:"en";i:1;s:2:"fr";i:2;s:2:"pt";}";
$registro = explode("\"",$registro);
$qtd = sizeof($registro);
for ($i=0; $i <= $qtd; $i++) {
    if ((($i % 2) != 0) and (trim($registro[$i]) != "")) {
        echo trim($registro[$i])."<br/>";
    }
}
Lembrando, essa string $registro sempre terá esse padrão porque já é adotado pelo sistema. Só quero saber se tem alguma solução mais profissional para o caso.

Obrigado.

--
Ítalo Barboza
Fone: +55(81)88810588
italo [at] italobarboza.com.br
http://www.italobarboza.com.br

Alessandro Ramos

unread,
Sep 15, 2008, 12:57:57 PM9/15/08
to list...@googlegroups.com
Opa,

Isso que vc tem é bem parecido com JSON:

http://www.json.org/json-pt.html

A diferença é que o JSON segue uma estrutura
{"var1":"valor1","var2":"valor2"} e vc pode usar json_decode no PHP
pra criar o objeto.

http://br.php.net/json_decode

2008/9/15 Ítalo Barboza <it...@italobarboza.com.br>:
--
[]'s & =*'s do lee
# Alessandro Ramos dos Santos @ Itaporanga @ SP @ Brasil
# MSN: lee.rain # Gtalk: edenfall # Orkut: 7093009035179968825

"A nação que resolve trocar um pouco de liberdade por um pouco de
ordem não consegue nenhuma das duas, e não merece a ambas" - Thomas
Jefferson

Beatriz KMS

unread,
Sep 15, 2008, 2:01:32 PM9/15/08
to list...@googlegroups.com
Vc poderia fazer com expressão regular... acho que fica bem mais legal.

2008/9/15 Ítalo Barboza <it...@italobarboza.com.br>:

Bernardo Vieira

unread,
Sep 15, 2008, 2:24:55 PM9/15/08
to list...@googlegroups.com
$str = 'a:3:{i:0;s:2:"en";i:1;s:2:"fr";i:2;s:2:"pt";}';
$arr = unserialize($str);
print_r($str);

Array
(
[0] => en
[1] => fr
[2] => pt
)

Beatriz KMS escreveu:

Ítalo Barboza

unread,
Sep 15, 2008, 3:07:08 PM9/15/08
to list...@googlegroups.com
Opa Bernardo. Funcionou sem problemas, só precisei trocar o print_r($str) por print_r($arr) e deu tudo certo!

Obrigado pela ajuda de todos!

2008/9/15 Bernardo Vieira <bvieir...@gmail.com>

Bernardo Vieira

unread,
Sep 15, 2008, 3:16:51 PM9/15/08
to list...@googlegroups.com
My bad!

Ítalo Barboza escreveu:

Ítalo Barboza

unread,
Sep 29, 2008, 2:03:12 PM9/29/08
to list...@googlegroups.com
Boa tarde, aproveitando a Thread, eu estou com um outro problema que também envolve strings com um padrão ... elas estão no formato:
[lang_en]English Text[/lang_en][lang_pt]Texto em Português[/lang_pt]

Estou tentando gerar um array da seguinte forma:
$valor[en] = "English Text";
$valor[pt] = "Texto em Português";

Mas não obtive sucesso. Alguém tem alguma dica para me ajudar?
Antecipadamente, obrigado a todos e uma boa semana.

Guilherme Souza

unread,
Sep 29, 2008, 2:34:46 PM9/29/08
to list...@googlegroups.com
Olá Italo,
quebre o texto usando explode(). "[lang_" separa os termos.
Use um for e substr(), que assim você obtem "en" e "English Text", "pt" e "Texto em Português"...

Guilherme Valente de Souza
MSN: guilher...@gmail.com
Celular: (11) 8667-9638
guilherme...@accenture.com
http://www.caronasunicamp.com



2008/9/29 Ítalo Barboza <it...@italobarboza.com.br>

Marcio Dorimar

unread,
Sep 29, 2008, 2:48:41 PM9/29/08
to list...@googlegroups.com
primeiro, tente com regex. se não der certo, tenta algo assim:

define('EN', 0);
define('PT', 1);

$lang = '[lang_en]English Text[/lang_en][lang_pt]Texto em Português[/lang_pt]';
$lang = str_replace(array('[lang_en]', '[/lang_pt]'), array('', ''), $lang);
$lang = explode('[/lang_en][lang_pt]', $lang);

echo $lang[EN], ' - ', $lang[PT];

2008/9/29 Guilherme Souza <guilher...@gmail.com>:
--
Márcio Dorimar da Silva Gomes
Desenvolvedor Java - Politec Global IT Services
Graduado em Ciências da Computacao - DSC - UFCG
http://marciodorimar.googlepages.com

Carlos Moraes

unread,
Sep 29, 2008, 9:35:45 PM9/29/08
to list...@googlegroups.com
Acho que a expressão regular é mais apropriada pro seu caso, adaptei uma rotina que uso pra testar seu caso, e funcionou, veja aí dois exemplos de como você pode usar se quiser.

<?
$en = '/\[lang_en\](.*)\[\/lang_en\]/';
$pt = '/\[lang_pt\](.*)\[\/lang_pt\]/';

$texto = "
[lang_en]English Text One[/lang_en][lang_pt]Texto em Português Um[/lang_pt]
[lang_en]English Text Two[/lang_en][lang_pt]Texto em Português Dois[/lang_pt]
[lang_en]English Text Three[/lang_en][lang_pt]Texto em Português Três[/lang_pt]
[lang_en]English Text Four[/lang_en][lang_pt]Texto em Português Quatro[/lang_pt]
[lang_en]English Text Five[/lang_en][lang_pt]Texto em Português Cinco[/lang_pt]
";

$i = preg_match_all( $en, $texto, $m );
$valor['en'] = $m[1];

$i = preg_match_all( $pt, $texto, $m );
$valor['pt'] = $m[1];

echo '<pre>';
echo 'TEXTO COM VÁRIAS LINHAS<BR><BR>';
echo $valor['pt'][0];
echo '<br />';
echo $valor['en'][0];
echo '<br>';
echo '<br>';
var_dump($valor);
echo '</pre>';
?>

No exemplo que você passou, a string tinha apenas uma linha, então se realmente for apenas uma linha é mais simples

<?
$texto = "[lang_en]English Text One[/lang_en][lang_pt]Texto em Português Um[/lang_pt]";

$i = preg_match( $en, $texto, $m );
$valor['en'] = $m[1];

$i = preg_match( $pt, $texto, $m );
$valor['pt'] = $m[1];

echo '<pre>';
echo 'TEXTO COM APENAS UMA LINHA<BR><BR>';
echo $valor['pt'];
echo '<br />';
echo $valor['en'];
echo '<br>';
echo '<br>';
var_dump($valor);
echo '</pre>';
?>

As saídas dessas rotinas são:

TEXTO COM VÁRIAS LINHAS

Texto em Português Um
English Text One

array(2) {
["en"]=>
array(5) {
[0]=>
string(16) "English Text One"
[1]=>
string(16) "English Text Two"
[2]=>
string(18) "English Text Three"
[3]=>
string(17) "English Text Four"
[4]=>
string(17) "English Text Five"
}
["pt"]=>
array(5) {
[0]=>
string(21) "Texto em Português Um"
[1]=>
string(23) "Texto em Português Dois"
[2]=>
string(23) "Texto em Português Três"
[3]=>
string(25) "Texto em Português Quatro"
[4]=>
string(24) "Texto em Português Cinco"
}
}

TEXTO COM APENAS UMA LINHA

Texto em Português Um
English Text One

array(2) {
["en"]=>
string(16) "English Text One"
["pt"]=>
string(21) "Texto em Português Um"
}




2008/9/29 Ítalo Barboza <it...@italobarboza.com.br>
Reply all
Reply to author
Forward
0 new messages