Autor Zpráva
Gogo_v
Profil
Dobrý den, mam preg_match_all('/: (?P<slot>[\d]{1,3})\nFrom: \+420(?P<mobil>[\d]{9})\n([^\n]*\n){7}(?P<text>[^\n]{1,900})\n/s', $data, $result, PREG_PATTERN_ORDER);
Který mi z SMS vypreparuje podstatné informace From a samotnou zprávu. Funguje to dobře ale pouze v případě že v textu nejsou ENTERy což při psani z mobilu většinou nejsou když ale pošle někdo zprávu z webu je problém :( Stejně tak když někdo začne Enterem takže po Message length: 119 je hned Enter
Nevíte náhodou někdo ja to upravit ať se ošetří popisovaný problém ? Ten preg_match_all mi kdysi pomohl kolega který je nedostupný proto s tím otravuju tady. Děkuji moc.
Slot: 1
From: +420601123456
Date: Wed Feb  9 8:53:19 2012
SMSC number: +420602999999
PDU type: SMS-DELIVER
PDU flags: MoreMessagesToSend
Settings: 7bit-GSM
Message length: 119

Dobry den,mel bych nejaky dotaz:
A protoze to pisu z webu cpu
do toho ENTER :(
Dekuji za pomoc
Tori
Profil
Gogo_v:
Tenhle regulár zpracuje text složený z jedné i více zpráv. Předpokládá, že nová zpráva začíná řetězcem "Slot: [číslo]" - pokud ne, změňte zvýrazněné části. Na konec zpracovávaného textu přidávám znova jakoby začátek zprávy, protože regulár podle něj určuje, kde končí víceřádkový text zprávy.

$re = '~Slot:\s(?<slot>\d{1,3})\s+From:\s\\+420(?<from>\d{9}).*?Message length:\s\d+\s(?<text>.*?)(?=Slot:\s\d)~s';
preg_match_all($re, $data."\nSlot: 123", $result, PREG_PATTERN_ORDER);
Keeehi
Profil
Nebo bez přilepování Slotu.
preg_match_all('~From: ([^\n]*).*?Message length: \d+(.*?)(?:Slot: |$)~s', $data, $result, PREG_PATTERN_ORDER);
Gogo_v
Profil
Děkuji za odpověď. Bohužel mi ani jeden z příkladů nedělá co potřebuju :( Pravděpodobě to bude rukama :)
Napíšu kus kódu který mi načítá SMS ze souborů

$name=$argv[1];
if (file_exists($name)) {
$fs = fopen($name,'r') ;
while(!feof($fs))
{ $dataread = fgets($fs,512);
  $data.=$dataread;
}

fclose($fs);

$pole = split('Slot',$data); // tady si to rozdělím pokud se jedná o více zpráv v jednom souboru
$pocitej = count($pole);
$data="";
echo "pocitej = ".$pocitej;  // debug vypíše mi kolik mám rozdělených zpráv

for($a=0;$a<$pocitej;$a++)
{ $datax = ereg_replace('Message header:.*.Message length:', 'Message length:',$pole[$a]); // timto odstraním ze zprávy proměnlivé hodnoty které jsou mi k ničemu :)
  $datax = ereg_replace('\(z internetu\)', '+420100000001',$datax);    //nahrazení řetězce posláno z na text  z konkretniho cisla (inet sms gw) ...
  if(strlen($pole[$a]) > 10 ) $data .=$datax; }  // uložení dat do proměnné pokud je delší než 10 znaků ... ošetřuju si tím případné vkládání nekorektních dat

 echo "\n data = ".$data;                                    // výpis dat která budu porovnávat

preg_match_all('/: (?P<slot>[\d]{1,3})\nFrom: \+420(?P<mobil>[\d]{9})\n([^\n]*\n){7}(?P<text>[^\n\n]{1,900})\n/s', $data, $result, PREG_PATTERN_ORDER);

for ($i = 0; $i < count($result[0]); $i++) { 
    echo "slot: {$result["slot"][$i]} , mobil: {$result["mobil"][$i]} , text: {$result["text"][$i]} \n";   //  výpis toho co mi vyparsoval preg_match
    $phone=$result["mobil"][$i];
    $zavada = addslashes($result["text"][$i]);
    $curdate = date("Y-n-j H:i:s");
   $qry = "INSERT into service (datum, telefon, text) VALUES ('$curdate', '$phone', '$zavada')";
  //MySQL_Query($qry);
  echo $qry."\n";     // vypsání query co mi bude ukladat do mysql
   }
 

Děkuji za pomoc.
Tori
Profil
Gogo_v:
Připadá mi, že si trochu přiděláváte práci. Zkuste použít některý z těch regulárů (Keehiho nebo můj) na hrubá data ze souboru (teda proměnná $data před řádkem 11) a nechte si vypsat, co to v textu najde.
Nahrazování tel.čísla za text můžete provést až před ukládáním do DB (okolo ř.27) a stačí použít obyčejné str_replace.
Gogo_v
Profil
Dobrý večer. Máte pravdu ten Váš regex dělá přesně to co jsem potřeboval vyházel jsem ty blbosti co jsem tam měl a funguje to skvěle :) Děkuji moc za pomoc třeba někdy i pochopím jak to funguje :D

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: