| 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: 15 let
|
|||
0