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

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Perl-kompatible regulære udtryk
Fra : Jonas Koch Bentzen


Dato : 10-02-02 20:02

Jeg har et script, der skal gå et andet PHP-script igennem og hente det
første argument til hvert kald af en bestemt funktion. Lad os sige, vi
har en funktion ved navn "funk". Første argument er altid en tekststreng
- og det må ikke være en variabel, der indeholder en streng, så
funktionskaldene ser altså sådan her ud:

funk("Streng omgivet af gåseøjne");

eller evt.:

funk('Streng omgivet af apostroffer');

Det, jeg vil, er så at hente "Streng omgivet af gåseøjne" og 'Streng
omgivet af apostroffer' ud (inkl. citationstegnene). Til det formål har
jeg skrevet et regulært udtryk:

preg_match_all("/[^a-zA-Z0-9]tr\((['\"].+['\"])\)[^a-zA-Z0-9]/sU",
$contents, $matches);

Det virker i for sig fint - indtil man har en streng, der indeholder
sammensætningen citationstegn + parentes slut + semikolon:

funk("javascript:window.open('test.txt', 'asdf', '');");

Dér vil preg_match_all selvfølgelig kun finde
"javascript:window.open('test.txt', 'asdf', ''". Ikke så godt. Nogen,
der har et forslag til, hvordan man kommer uden om den?

Og så en anden ting: Jeg har på fornemmelsen, at "[^a-zA-Z0-9]" kan
skrives smartere med Perl-kompatible regulære udtryk, men eftersom jeg
først er begyndt at se på PCRE for en time siden, så... Hvad kan
"a-zA-Z0-9" også skrives som i PCRE?

--
Jonas Koch Bentzen

http://understroem.dk/

 
 
Anders Johannsen (11-02-2002)
Kommentar
Fra : Anders Johannsen


Dato : 11-02-02 11:11

"Jonas Koch Bentzen" <ingen.emailadresse@eksempel.dk> wrote in message
news:a46g3q$hi1$1@sunsite.dk...

> funk("javascript:window.open('test.txt', 'asdf', '');");
>
> Dér vil preg_match_all selvfølgelig kun finde
> "javascript:window.open('test.txt', 'asdf', ''". Ikke så godt. Nogen,
> der har et forslag til, hvordan man kommer uden om den?

I ruby syntaks (som også benytter sig af PCRE):

str = %{funk("javascript:window.open('test.txt', 'asdf', '');");}

if str =~ /funk\((['"])([^\1]*)\1\)/
puts "Success: #{$2}"
end

Strategien er således at lede efter 'funk' + '(' + enkelt eller dobbelt
pling + alt _undtagen_ foregående + foregående + ')'

/A



Jonas Koch Bentzen (11-02-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 11-02-02 11:18

Anders Johannsen skrev:

> "Jonas Koch Bentzen" <ingen.emailadresse@eksempel.dk> wrote in message
> news:a46g3q$hi1$1@sunsite.dk...
>
>> funk("javascript:window.open('test.txt', 'asdf', '');");
>>
>> Dér vil preg_match_all selvfølgelig kun finde
>> "javascript:window.open('test.txt', 'asdf', ''". Ikke så godt. Nogen,
>> der har et forslag til, hvordan man kommer uden om den?
>
> I ruby syntaks (som også benytter sig af PCRE):

Normalt bruger Ruby standard-POSIX-kompatible regulære udtryk, ikke? Det
er i hvert fald det, jeg har brugt.

> str = %{funk("javascript:window.open('test.txt', 'asdf', '');");}
>
> if str =~ /funk\((['"])([^\1]*)\1\)/

Tak for det - det prøver jeg.

--
Jonas Koch Bentzen

http://understroem.dk/

Anders Johannsen (11-02-2002)
Kommentar
Fra : Anders Johannsen


Dato : 11-02-02 11:43

> Normalt bruger Ruby standard-POSIX-kompatible regulære udtryk, ikke? Det
> er i hvert fald det, jeg har brugt.

Ruby understøtter perl5 kompatible regulære udtryk

/A



Jonas Koch Bentzen (11-02-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 11-02-02 11:53

Anders Johannsen skrev:

>> Normalt bruger Ruby standard-POSIX-kompatible regulære udtryk, ikke?
>> Det er i hvert fald det, jeg har brugt.
>
> Ruby understøtter perl5 kompatible regulære udtryk

Men ikke POSIX?

--
Jonas Koch Bentzen

http://understroem.dk/

Jonas Koch Bentzen (11-02-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 11-02-02 15:58

Anders Johannsen skrev:

> "Jonas Koch Bentzen" <ingen.emailadresse@eksempel.dk> wrote in message
> news:a46g3q$hi1$1@sunsite.dk...
>
>> funk("javascript:window.open('test.txt', 'asdf', '');");
>>
>> Dér vil preg_match_all selvfølgelig kun finde
>> "javascript:window.open('test.txt', 'asdf', ''". Ikke så godt. Nogen,
>> der har et forslag til, hvordan man kommer uden om den?
>
> I ruby syntaks (som også benytter sig af PCRE):
>
> str = %{funk("javascript:window.open('test.txt', 'asdf', '');");}
>
> if str =~ /funk\((['"])([^\1]*)\1\)/

Hvis nogen skulle være nysgerrige: Den færdige preg_match_all ser sådan
her ud:

preg_match_all("/[^a-zA-Z0-9]tr\(((['\"]).*[^\\\]\\2)\)[^a-zA-Z0-9]/sU",
$contents, $matches);

--
Jonas Koch Bentzen

http://understroem.dk/

Jonas Delfs (11-02-2002)
Kommentar
Fra : Jonas Delfs


Dato : 11-02-02 16:52

"Anders Johannsen" <anders@johannsen.com> skrev i en meddelelse
news:3c679899$0$62885$edfadb0f@dspool01.news.tele.dk...
> "Jonas Koch Bentzen" <ingen.emailadresse@eksempel.dk> wrote in message
> news:a46g3q$hi1$1@sunsite.dk...
>
> > funk("javascript:window.open('test.txt', 'asdf', '');");
> >
> > Dér vil preg_match_all selvfølgelig kun finde
> > "javascript:window.open('test.txt', 'asdf', ''". Ikke så godt. Nogen,
> > der har et forslag til, hvordan man kommer uden om den?
>
> I ruby syntaks (som også benytter sig af PCRE):

Ikke helt rigtigt.
Ruby benytter sig ikke af PCRE, men Perl's egne regulære udtryk. Eneste
forskelle mellem Ruby's og Perl's implementioner skulle ligge i at det der
stadig regnes for ustabilt i Perl ikke understøttes i Ruby.

--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk



Anders Johannsen (11-02-2002)
Kommentar
Fra : Anders Johannsen


Dato : 11-02-02 18:19


"Jonas Delfs" <jonas@NOSPAMdelfs.dk> wrote in message
news:a48phf$7vh$1@sunsite.dk...

> Ikke helt rigtigt.
> Ruby benytter sig ikke af PCRE, men Perl's egne regulære udtryk. Eneste
> forskelle mellem Ruby's og Perl's implementioner skulle ligge i at det der
> stadig regnes for ustabilt i Perl ikke understøttes i Ruby.

Hvad mener du med "Perl's egne regulære udtryk"? Ruby har understøttelse for
den syntaks, som anvendes i perl5, uden at de to implementationer deler
kode.

Jeg benytter iøvrigt PCRE i betydningen 'Perl Compatible Regular
Expressions' -- ikke som det specifikke PCRE funktionsbibliotek.

/A



Jonas Delfs (11-02-2002)
Kommentar
Fra : Jonas Delfs


Dato : 11-02-02 18:25

"Anders Johannsen" <anders@johannsen.com> skrev i en meddelelse
news:3c67fceb$0$62879$edfadb0f@dspool01.news.tele.dk...
> "Jonas Delfs" <jonas@NOSPAMdelfs.dk> wrote in message
> news:a48phf$7vh$1@sunsite.dk...
>
> > Ikke helt rigtigt.
> > Ruby benytter sig ikke af PCRE, men Perl's egne regulære udtryk. Eneste
> > forskelle mellem Ruby's og Perl's implementioner skulle ligge i at det
der
> > stadig regnes for ustabilt i Perl ikke understøttes i Ruby.
>
> Hvad mener du med "Perl's egne regulære udtryk"? Ruby har understøttelse
for
> den syntaks, som anvendes i perl5, uden at de to implementationer deler
> kode.

Det er rigtigt.
Det jeg mener er at Ruby ikke benytter PCRE-biblioteket men har hugget
Perl's egen kode til at håndtere regulære udtryk, for optimal hastighed.

> Jeg benytter iøvrigt PCRE i betydningen 'Perl Compatible Regular
> Expressions' -- ikke som det specifikke PCRE funktionsbibliotek.

Okay - det er så her vi går forbi hinanden. :)

--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk



Anders Johannsen (11-02-2002)
Kommentar
Fra : Anders Johannsen


Dato : 11-02-02 22:08

"Jonas Delfs" <jonas@NOSPAMdelfs.dk> wrote in message
news:a48uve$ms9$1@sunsite.dk...

> Det er rigtigt.
> Det jeg mener er at Ruby ikke benytter PCRE-biblioteket men har hugget
> Perl's egen kode til at håndtere regulære udtryk, for optimal hastighed.

Interessant. Hvor har du det fra?

Så vidt jeg kan vurdere er biblioteket et kraftigt udvidet GNU libc
bibliotek. Hvorvidt matz har kigget Perl over skulderen da han implementere
perl5 kompatible regulære udtryk, skal jeg ikke afvise.

/A



Jonas Delfs (11-02-2002)
Kommentar
Fra : Jonas Delfs


Dato : 11-02-02 22:08

"Anders Johannsen" <anders@ignition.dk> skrev i en meddelelse
news:3c6832bc$0$231$edfadb0f@dspool01.news.tele.dk...
> "Jonas Delfs" <jonas@NOSPAMdelfs.dk> wrote in message
> news:a48uve$ms9$1@sunsite.dk...
>
> > Det jeg mener er at Ruby ikke benytter PCRE-biblioteket men har hugget
> > Perl's egen kode til at håndtere regulære udtryk, for optimal hastighed.
>
> Interessant. Hvor har du det fra?

Jeg har fulgt en diskussion på ruby-lang mailinglisten og fik det bekræftet
da jeg spurgte til Ruby's regulære udtryk på IRC (#ruby-lang).

--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk



Anders Johannsen (11-02-2002)
Kommentar
Fra : Anders Johannsen


Dato : 11-02-02 22:54

"Jonas Delfs" <jonas@NOSPAMdelfs.dk> wrote in message
news:a49c1u$4jh$1@sunsite.dk...

> > Interessant. Hvor har du det fra?
>
> Jeg har fulgt en diskussion på ruby-lang mailinglisten og fik det
bekræftet
> da jeg spurgte til Ruby's regulære udtryk på IRC (#ruby-lang).

Reference?

Fra ruby/regex.c:

/* Extended regular expression matching and search library.
Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file LGPL. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
Last change: May 21, 1993 by t^2 */
/* removed gapped buffer support, multiple syntax support by matz
<matz@nts.co.jp> */
/* Perl5 extension added by matz <matz@caelum.co.jp> */
/* UTF-8 extension added Jan 16 1999 by Yoshida Masato
<yoshidam@tau.bekkoame.ne.jp> */

/A



Jonas Delfs (11-02-2002)
Kommentar
Fra : Jonas Delfs


Dato : 11-02-02 23:29

"Anders Johannsen" <anders@ignition.dk> skrev i en meddelelse
news:3c683d74$0$269$edfadb0f@dspool01.news.tele.dk...
> "Jonas Delfs" <jonas@NOSPAMdelfs.dk> wrote in message
> news:a49c1u$4jh$1@sunsite.dk...
>
> > > Interessant. Hvor har du det fra?
> >
> > Jeg har fulgt en diskussion på ruby-lang mailinglisten og fik det
> bekræftet
> > da jeg spurgte til Ruby's regulære udtryk på IRC (#ruby-lang).
>
> Reference?

Et svar på IRC kan jeg næppe referere til, og da jeg så tråden på ruby-lang
listen igennem igen fik jeg bekræftet min bange anelse om at du har ret :),
og at snakken om at hugge fra Perl eller bruge PCRE blev ved snakken.
Tråden om regex implementation starter ca her:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/16184

--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste