/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Regulære udtryk II
Fra : Jimmy


Dato : 25-12-02 17:55

Hej

Jeg har en fil, som indeholder en SMS, hvorfra jeg skal bruge følgende
linier:

SC address, Originating address, Data coding scheme, SC timestamp, User data
length, User data


SMS modtages i nedenstående format:

Message type: SMS-DELIVER
SC address: '4540390999'
More messages to send: 1
Reply path: 0
User data header indicator: 0
Status report indication: 0
Originating address: '4540390999'
Protocol identifier: 0x0
Data coding scheme: default alphabet
SC timestamp: 12/25/2002 03:19:17 PM (+0100)
User data length: 3
User data header: 0x
User data: 'HEJ'


En ond person kan sende nedenstående mellem '' som User data:

User data: '
Originating address: 'xxxxxx'
'

Jeg har nu to "Originating address" og scriptet fejler.

Kan man klare mit problem med RegExp?
Jeg har indtil videre brugt :

/^(.*?): (.*)/

Men det løser ikke mit problem...

Anyone?

Mvh
Jimmy



 
 
Lars Balker Rasmusse~ (26-12-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 26-12-02 01:15

"Jimmy" <spoerg@efter.den> writes:
> SMS modtages i nedenstående format:
[...]
> User data: 'HEJ'
>
>
> En ond person kan sende nedenstående mellem '' som User data:
>
> User data: '
> Originating address: 'xxxxxx'
> '

Kan han det? Hvor får du SMS-formatet fra? Hvis brugeren kan sende '
i userdata uden at det program der genererer formatet gør noget ved
det (evt. med \ foran '), når det selv putter '' om, kan det ikke
parses.

En ondere person kunne jo sende:

User data: '
'
'
'
Originating address: 'xxxxxx'
'
'
'
'
'
User data: '
'
'
'
'
'
'
'

Hmm. Kan du være sikker på at User data: er det SIDSTE i filen du
læser? I så fald er det ret nemt, du laver bare en special case for
User data, der spiser resten af input, og smider de yderste 'er væk.

while (<SMS>) {
if (/^User data: '(.*)/) {
$userdata = $1 . <SMS>;
$userdata =~ s/'$/s;
...
}
elsif (/^(.*?): (?:'.*)/) {
...
}
}
--
Lars Balker Rasmussen                  "S.M.R.T."

Jimmy (26-12-2002)
Kommentar
Fra : Jimmy


Dato : 26-12-02 01:35


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fr8c5y6sv.fsf@laphroaig.balker.org...
> "Jimmy" <spoerg@efter.den> writes:
> > SMS modtages i nedenstående format:
> [...]
> > User data: 'HEJ'
> >
> >
> > En ond person kan sende nedenstående mellem '' som User data:
> >
> > User data: '
> > Originating address: 'xxxxxx'
> > '
>
> Kan han det? Hvor får du SMS-formatet fra?

Brugeren sender en SMS til mit GSM-modem.
Han kan derfor skrive hvad som helst - inklusive newline og '.

> Hvis brugeren kan sende '
> i userdata uden at det program der genererer formatet gør noget ved
> det (evt. med \ foran '), når det selv putter '' om, kan det ikke
> parses.

Programmet der henter det ind (gsmlib) gør intet ved det.
Det er sor så vidt ligeglad hvad en bruger sender.


> Hmm. Kan du være sikker på at User data: er det SIDSTE i filen du
> læser?

Ja det skulle jeg mene.
Gsmlib har på intet tidspunkt gjort andet end at outputte filer som den jeg
sendte.


> I så fald er det ret nemt, du laver bare en special case for
> User data, der spiser resten af input, og smider de yderste 'er væk.
>
> while (<SMS>) {
> if (/^User data: '(.*)/) {
> $userdata = $1 . <SMS>;
> $userdata =~ s/'$/s;
> ...
> }
> elsif (/^(.*?): (?:'.*)/) {
> ...
> }
> }

Jeg prøver med ovenstående.
Tak for det hurtige svar

Mvh
Jimmy




Jimmy (26-12-2002)
Kommentar
Fra : Jimmy


Dato : 26-12-02 03:40


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fr8c5y6sv.fsf@laphroaig.balker.org...
> "Jimmy" <spoerg@efter.den> writes:


> while (<SMS>) {
> if (/^User data: '(.*)/) {
> $userdata = $1 . <SMS>;
> $userdata =~ s/'$/s;
> ...
> }
> elsif (/^(.*?): (?:'.*)/) {
> ...
> }
> }

Nu har jeg siddet i et stykke tid og er kommet frem til nedenstående, som
dog fejler :-/
Det er baseret på det stykke kode du gav mig for et stykke tid siden.

Hvad er det jeg gør galt?

Mvh
Jimmy

-------------
syntax error at test.pl line 17, near "(."
(Might be a runaway multi-line // string starting on line 14)
Search pattern not terminated at test.pl line 17.
-------------




-------------
my %store_in_db = map { $_ => 1 }
("SC timestamp", "Originating address", "User data", "User data length",
"SC address");

open SMS, "/root/gsm/sms_in/104083198339170";

my @sms;
my $userdata;

while (<SMS>)
{
if (/^User data: '(.*)/)
{
$userdata = $1 . <SMS>;
$userdata =~ s/'$/s;
print "$userdata \n";
}
elsif (/^(.*?): (?:'.*)/)
{
my ($field, $data) = ($1, $2);
if ($store_in_db{$field})
{
print "$field - $data \n";
}
}
}

-------------



Lars Balker Rasmusse~ (26-12-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 26-12-02 13:27

"Jimmy" <spoerg@efter.den> writes:
> -------------
> syntax error at test.pl line 17, near "(."
> (Might be a runaway multi-line // string starting on line 14)
> Search pattern not terminated at test.pl line 17.
> -------------
>
> while (<SMS>)
> {
> if (/^User data: '(.*)/)
> {
> $userdata = $1 . <SMS>;
> $userdata =~ s/'$/s;

Jeg har glemt et / i ovenstående:

$userdata =~ s/'$//s;
--
Lars Balker Rasmussen                  "S.M.R.T."

Jimmy (26-12-2002)
Kommentar
Fra : Jimmy


Dato : 26-12-02 21:11


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fn0mtx8xm.fsf@laphroaig.balker.org...
> "Jimmy" <spoerg@efter.den> writes:
>
> Jeg har glemt et / i ovenstående:
>
> $userdata =~ s/'$//s;

Det løste fejlmeddelelsen, tak for det!

Jeg får dog ikke læst resten af SMS ind i min variabel.

Jeg parser en SMS med nedenstående format, som giver nedenstående resultat.
Koden står til sidst.

User data strækker sig jo over flere linier og det ser ud til at jeg kun får
den første eller noget.

Beklager jeg bliver nødt til at spørge så meget :-/

Mvh
Jimmy



SMS
---
Type of message: SMS message
---------------------------------------------------------------------------
Message type: SMS-DELIVER
SC address: '4540390999'
More messages to send: 1
Reply path: 0
User data header indicator: 0
Status report indication: 0
Originating address: '4540390999'
Protocol identifier: 0x0
Data coding scheme: default alphabet
SC timestamp: 12/25/2002 04:31:22 PM (+0100)
User data length: 1
User data header: 0x
User data: '
User data: 'HEJ'
'
'
'
'
''
SC Address: 'xxxxxx'
s
s
s

---------------------------------------------------------------------------


RESULT
------
SC address - '4540390999'
Originating address - '4540390999'
SC timestamp - 12/25/2002 04:31:22 PM (+0100)
User data length - 1
User data: 'HEJ

[root@fw shell]#




KODEN
-----
my %store_in_db = map { $_ => 1 }
("SC timestamp", "Originating address", "User data", "User data length",
"SC address");

open SMS, "$dir/$file" or die "open $file: $!";

my @sms;
my $userdata;

while (<SMS>)
{
if (/^User data: '(.*)/)
{
$userdata = $1 . <SMS>;
$userdata =~ s/'$//s;
print "$userdata \n";
}
elsif (/^(.*?): (.*)/)
{
my ($field, $data) = ($1, $2);
if ($store_in_db{$field})
{
print "$field - $data \n";
}
}
}





Lars Balker Rasmusse~ (27-12-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 27-12-02 16:23

"Jimmy" <spoerg@efter.den> writes:
> User data strækker sig jo over flere linier og det ser ud til at jeg kun får
> den første eller noget.
[...]
> $userdata = $1 . <SMS>;

Brainfart. Ovenstående skal være

$userdata = $1 . join "", <SMS>;

<> læser kun den næste linie i scalar kontekst, så med join tvinger vi
en list kontekst, så resten af filen tages med.
--
Lars Balker Rasmussen                  "S.M.R.T."

Kim Hansen (27-12-2002)
Kommentar
Fra : Kim Hansen


Dato : 27-12-02 17:46

Lars Balker Rasmussen <lars@balker.org> writes:

> "Jimmy" <spoerg@efter.den> writes:
> > User data strækker sig jo over flere linier og det ser ud til at jeg kun får
> > den første eller noget.
> [...]
> > $userdata = $1 . <SMS>;
>
> Brainfart. Ovenstående skal være
>
> $userdata = $1 . join "", <SMS>;
>
> <> læser kun den næste linie i scalar kontekst, så med join tvinger vi
> en list kontekst, så resten af filen tages med.

Jeg ville tro at dette er bedre end at hente filen ind i linjer, og så
derefter sætte den sammen igen:

{
local $/; # enable "slurp" mode
$userdata = $1 . <SMS>;
}

Se beskrivelsen af $INPUT_RECORD_SEPARATOR i perlvar.

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Lars Balker Rasmusse~ (27-12-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 27-12-02 20:48

Kim Hansen <k-tahf.qvxh@oek.dk> writes:
> Jeg ville tro at dette er bedre end at hente filen ind i linjer, og så
> derefter sætte den sammen igen:
>
> {
> local $/; # enable "slurp" mode
> $userdata = $1 . <SMS>;
> }
>
> Se beskrivelsen af $INPUT_RECORD_SEPARATOR i perlvar.

Naturligvis, men nu snakker vi altså om SMS-beskeder
--
Lars Balker Rasmussen                  "S.M.R.T."

Jimmy (27-12-2002)
Kommentar
Fra : Jimmy


Dato : 27-12-02 17:56


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fwulvwkof.fsf@laphroaig.balker.org...
> "Jimmy" <spoerg@efter.den> writes:
> > User data strækker sig jo over flere linier og det ser ud til at jeg kun
får
> > den første eller noget.
> [...]
> > $userdata = $1 . <SMS>;
>
> Brainfart. Ovenstående skal være
>
> $userdata = $1 . join "", <SMS>;
>
> <> læser kun den næste linie i scalar kontekst, så med join tvinger vi
> en list kontekst, så resten af filen tages med.

Herligt - Nu lader det til det virker!

Så skal der crash-testes

Godt nytår og tak for hjælpen endnu en gang.

Mvh
Jimmy



Søg
Reklame
Statistik
Spørgsmål : 177436
Tips : 31962
Nyheder : 719565
Indlæg : 6408017
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste