Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera eu tenho um txt
[2222]
callerid=Fax <2222>
secret=pow@a.123
context=fax
mailbox=
setvar=USER=2222
setvar=GRUPO=engenharia
setvar=CW=no
setvar=MAIL=telefonista@ntk.com.br
setvar=PERMISSAO=fax
eu precisava concatenar esse setvar mas o problema que ele pode vim com masi ou menos linhas entao preciso qo eu
!) contar quantas linhas vem com setvar=
2) retirar o setvar=
3) inserir na coluna certa apenas os que tem setvar= na frente
como posso fazer???
Olha que eu ja fiz...
$dir = "./";
$abredir = opendir($dir);
while ($arqs = readdir($abredir)) {
if ($arqs != "." && $arqs != ".." && is_file($arqs) && ereg(".conf", $arqs)) {
$abre = fopen($arqs,"r");
$le = fread($abre,filesize($arqs));
$dado = explode("\n",$le);
$id = $dado['0'];
$id_f = str_replace("[", "", $id);
$var1 = str_replace("]", "", $id_f);
$teste2 = $dado['1'];
$var2 = str_replace("callerid=", "", $teste2);
$teste3 = $dado['2'];
$var3 = str_replace("secret=", "", $teste3);
$teste4 = $dado['3'];
$var4 = str_replace("context=", "", $teste4);
$teste5 = $dado['4'];
$var5 = str_replace("mailbox=", "", $teste5);
o txt ta assim ta assim
[2222]
callerid=Fax <2222>
secret=pow@a.123
context=fax
mailbox=
setvar=USER=2222
setvar=GRUPO=engenharia
setvar=CW=no
setvar=MAIL=telefonista@ntk.com.br
setvar=PERMISSAO=fax
language=pt_BR
pickupgroup=1
callgroup=1
type=friend
host=dynamic
canreinvite=no
nat=no
qualify=yes
call-limit=10
notifyringing=yes
gravacoes=no
ate o mailbox é igual so no setvar as vzs vem 1 so as vzs vem 2 e no allow tambem ai precisava identificar o setvar e o allow pra concatenar e inserir num insert
insert into sip_buddies values
name='$var1',
callerid='$var2',
secret='$var3',
context='$var4';
mailbox='$var5',
setvar='',
language='',
pickupgroup='',
callgroup='',
type='',
host='',
canreinvite='',
nat='',
qualify='',
call-limit='',
notifyringing='',
gravacoes='',
disallow='',
allow=''
pra entender olha o array de 2 arquivo diferente
Array ( [0] => [2222] [1] => callerid=Fax <2222> [2] => secret=pow@a.123 [3] => context=fax [4] => mailbox= [5] => setvar=USER=2222 [6] => setvar=GRUPO=engenharia [7] => setvar=CW=no [8] => setvar=MAIL=telefonista@pow.com.br [9] => setvar=PERMISSAO=fax [10] => language=pt_BR [11] => pickupgroup=1 [12] => callgroup=1 [13] => type=friend [14] => host=dynamic [15] => canreinvite=no [16] => nat=no [17] => qualify=yes [18] => call-limit=10 [19] => notifyringing=yes [20] => gravacoes=no [21] => )
Array ( [0] => [2238] [1] => callerid=Cadu <2238> [2] => secret=pow@h92d.123 [3] => context=rinternos [4] => mailbox=2238@default [5] => setvar=USER=2238 [6] => setvar=GRUPO=engenharia [7] => setvar=CW=yes [8] => setvar=PERMISSAO=internacionais [9] => language=pt_BR [10] => pickupgroup=9 [11] => callgroup=9 [12] => type=friend [13] => host=dynamic [14] => canreinvite=no [15] => nat=yes [16] => qualify=yes [17] => call-limit=10 [18] => notifyringing=yes [19] => gravacoes=yes [20] => disallow=all [21] => allow=g729 [22] => allow=gsm [23] => )
um vem 21 e outro 23 ai precisava identificar so o que é setvar para concatenar e allow tambem
Primeiro, leia o arquivo para um array, com file(), por exemplo.
Então, usando preg_grep(), que permite aplicar um ER à um array, retornando todos os índices que casem com o padrão fornecedo, você "filtra" para todos aqueles que iniciam com o termo desejado.
Daí, você precisa limpar os dados. Isso você pode fazer com foreach, for, while... Eu faria com array_walk(), usando uma referência (variável precedida por & ), acho que fica mais legível.
Por fim, una tudo com implode().
Como pela sua última resposta parece que são vários arquivos, você pode agrupar tudo numa função e invocála dentro do seu while().
>
Primeiro, leia o arquivo para um array, com file(), por exemplo.
Então, usando preg_grep(), que permite aplicar um ER à um array, retornando todos os índices que casem com o padrão fornecedo, você "filtra" para todos aqueles que iniciam com o termo desejado.
Daí, você precisa limpar os dados. Isso você pode fazer com foreach, for, while... Eu faria com array_walk(), usando uma referência (variável precedida por & ), acho que fica mais legível.
Por fim, una tudo com implode().
Como pela sua última resposta parece que são vários arquivos, você pode agrupar tudo numa função e invocála dentro do seu while().
nossa ...
sou meio novato nao vou conseguir fazer isso nunca =(
olha esta saindo so preciso de uma coisa
<?
$dir = "./";
$abredir = opendir($dir);
while ($arqs = readdir($abredir)) {
if ($arqs != "." && $arqs != ".." && is_file($arqs) && ereg(".conf", $arqs)) {
$abre = fopen($arqs,"r");
$le = fread($abre,filesize($arqs));
$dado = explode("\n",$le);
//print_r($dado);
$id = $dado['0'];
$id_f = str_replace("[", "", $id);
$var1 = str_replace("]", "", $id_f);
//
foreach ($dado as $key => $value) {
if (substr($value,0, 9) == "callerid=") {
$caller = str_replace("callerid=", "", $value);
$var2 = $caller;
}
if (substr($value,0, 7) == "secret=") {
$secret = str_replace("secret=", "", $value);
$var3 = $secret;
}
if (substr($value,0, 8) == "context=") {
$context = str_replace("context=", "", $value);
$var4 = $context;
}
if (substr($value,0, 8) == "mailbox=") {
$mailbox = str_replace("mailbox=", "", $value);
$var5 = $mailbox;
}
if (substr($value,0, 7) == "setvar=") {
$setvar = str_replace("setvar=", "", $value);
$var6 = $setvar . ";";
$result = count($var6);
echo $result;
}
}
echo "
insert into sip_buddies values
name='$var1',
callerid='$var2',
secret='$var3',
context='$var4';
mailbox='$var5',
setvar='$var6'
";
echo "<br>";
}
}
precisava enviar pra fora do foreach todos registros do setvar= nao posso executar a query dentro do foreach q ele pega todos elementos do array tem q ser no while, mas quando insiro o $var6 fora do foreach ele so me traz o ultimo registro, como posso sanar esse problema?
Eu tentei o seguinte código e está quase....nao vou desistir ate conseguir...
<?
$dir = "./";
$abredir = opendir($dir);
while ($arqs = readdir($abredir)) {
if ($arqs != "." && $arqs != ".." && is_file($arqs) && ereg(".conf", $arqs)) {
$abre = fopen($arqs,"r");
$le = fread($abre,filesize($arqs));
$dado = explode("\n",$le);
//print_r($dado);
$id = $dado['0'];
$id_f = str_replace("[", "", $id);
$var1 = str_replace("]", "", $id_f);
foreach ($dado as $key => $value) {
if (substr($value,0, 9) == "callerid=") {
$caller = str_replace("callerid=", "", $value);
$var2 = $caller;
}
if (substr($value,0, 7) == "secret=") {
$secret = str_replace("secret=", "", $value);
$var3 = $secret;
}
if (substr($value,0, 8) == "context=") {
$context = str_replace("context=", "", $value);
$var4 = $context;
}
if (substr($value,0, 8) == "mailbox=") {
$mailbox = str_replace("mailbox=", "", $value);
$var5 = $mailbox;
}
if (substr($value,0, 7) == "setvar=") {
$setvar = str_replace("setvar=", "", $value);
$var6 = $setvar ;
$tudo[] = $var6;
$setando = implode(';',$tudo);
}
}
echo "
insert into sip_buddies values
name='$var1',
callerid='$var2',
secret='$var3',
context='$var4';
mailbox='$var5',
setvar='$setando'
";
echo "<br>";
}
}
e o resultado foi que no segundo insert ele repetiu o primeiro array eu queria q isso nao acontecesse será que é so resetar o array?
olha como ficou o insert onde ta em negrito ta errado pq ja foi inserido no primeiro insert
insert into sip_buddies values name='2222', callerid='Fax <2222>', secret='pow@a.123', context='fax'; mailbox='', setvar='USER=2222;GRUPO=engenharia;CW=no;MAIL=telefonista@pow.com.br;PERMISSAO=fax'
insert into sip_buddies values name='2238', callerid='Cadu <2238>', secret='pow@h92d.123', context='rinternos'; mailbox='2238@default', setvar='**USER=2222;GRUPO=engenharia;CW=no;MAIL=telefonista@ntk.com.br;PERMISSAO=fax;**USER=2238;GRUPO=engenharia;CW=yes;PERMISSAO=internacionais'Tenta fazer, parece complicado mas não é.
Apenas uma correção no que eu disse antes. Ao invés de usar array_walk(), pode usar str_replace() direto. Ele também aceita arrays.
SE não conseguir, depois de provado com sua tentativa, claro, eu te ajudo.
Vamos recapitular, porque suas repsostas são enromes e eu mesmo já me perdi :P
-
Mama, papa, array... o.O
Leia os dados para um array.
Se estiverem em uma string, use explode(). Mas como você os tem num arquivo, use file()
-
Separe o joio do trigo
Desse array gerado, você só quer os índices que comecem com setvar=
-
Limpe a casa
Você quer apagar o termo usado como filtro, então str_replace() é quem você procura.
acho q da pra fazer por passos, primeiro remove td o q n interessa com uma regex.
depois fica so a parte do setvar=, ai é inserir essa parte n entendi bem.....se puder passar a tabela.
da uma olhda em preg_replace();