Autor | Zpráva | ||
---|---|---|---|
Gogo_v Profil |
#1 · Zasláno: 9. 2. 2012, 11:36:50
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 |
#3 · Zasláno: 10. 2. 2012, 21:31:21
Nebo bez přilepování Slotu.
preg_match_all('~From: ([^\n]*).*?Message length: \d+(.*?)(?:Slot: |$)~s', $data, $result, PREG_PATTERN_ORDER); |
||
Gogo_v Profil |
#4 · Zasláno: 12. 2. 2012, 18:07:28
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 |
#5 · Zasláno: 12. 2. 2012, 19:19:33
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 |
#6 · Zasláno: 12. 2. 2012, 20:28:14
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
|
||
Časová prodleva: 12 let
|
0