/ 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
Finde ord i en tekst
Fra : Allan Kok


Dato : 10-08-07 18:58

Jeg har en tekst, og et array med ord.

Jeg kan så finde udaf om et af ordene indgår i teksten. Skal jeg lave noget
med strpos med hver ord for at se om det indgår, eller er der en smart
funktion der kan?

mvh
Allan



 
 
Bertel Lund Hansen (10-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-08-07 19:49

Allan Kok skrev:

> Jeg kan så finde udaf om et af ordene indgår i teksten. Skal jeg lave noget
> med strpos med hver ord for at se om det indgår, eller er der en smart
> funktion der kan?

Jeg er ikke bekendt med nogen smart funktion, men et simpelt
gennemløb er nok hvis du laver et array med de ord der skal
findes:

$please_find = array ('første', 'andet');
$text = file_get_contents('hcandersenseventyr.txt');

foreach ($please_find as $find)
   if (strpos($text,$find)!==false)
      echo "Har fundet ".$find;

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Johan Holst Nielsen (10-08-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 10-08-07 19:59

Bertel Lund Hansen wrote:
> $please_find = array ('første', 'andet');
> $text = file_get_contents('hcandersenseventyr.txt');
>
> foreach ($please_find as $find)
>    if (strpos($text,$find)!==false)
>       echo "Har fundet ".$find;
>

Det er ikke super god...

'første' vil også matche førstehold, førstedame osv.
'andet' kunne også matche andre ting som andetsteds, andetled osv. hvor
det ikke er samme ord...

F.eks. et match på 'I' vil gå helt galt med ovenstående løsning - så der
skal lidt mere information til. Er teksten en bestående af sætninger
eller blot en masse kommasepareret ord - eller hvorledes er det lavet?

En mulighed var at første strippe alle tegn som man ikke formødes at
bruge (altså kun bibeholde f.eks. a-å. Dermed fjerne alle .,!? osv.).
Derefter lave et explode på mellemrum og så bruge array_interselect til
at finde ordene.

--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk

Johan Holst Nielsen (10-08-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 10-08-07 20:01

Johan Holst Nielsen wrote:
> En mulighed var at første strippe alle tegn som man ikke formødes at
> bruge (altså kun bibeholde f.eks. a-å. Dermed fjerne alle .,!? osv.).
> Derefter lave et explode på mellemrum og så bruge array_interselect til
> at finde ordene.
>

Mente selvfølgelig array_intersect :)

--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk

im (11-08-2007)
Kommentar
Fra : im


Dato : 11-08-07 08:48

Brug preg_match eller anden lignende regulær match i stedet for instr.
(ereg, eregi)

http://dk2.php.net/preg-match

mvh Kim Isaksen


On 10 Aug., 21:00, Johan Holst Nielsen <s...@phpgeek.dk> wrote:
> Johan Holst Nielsen wrote:
> > En mulighed var at første strippe alle tegn som man ikke formødes at
> > bruge (altså kun bibeholde f.eks. a-å. Dermed fjerne alle .,!? osv.).
> > Derefter lave et explode på mellemrum og så bruge array_interselect til
> > at finde ordene.
>
> Mente selvfølgelig array_intersect :)
>
> --
> Johan Holst Nielsen
> Freelance PHP Developer -http://phpgeek.dk


Bertel Lund Hansen (11-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 11-08-07 09:38

im skrev:

> Brug preg_match eller anden lignende regulær match i stedet for instr.
> (ereg, eregi)

Hvis man ikke har brug for styrken i reguklære udtryk, råder
PHP-manualen fra at man bruger de funktioner. Strpos() skulle
være den hurtigste mulighed hvis man blot skal have svaret ja/nej
(eller den første position).

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Johan Holst Nielsen (11-08-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 11-08-07 10:27

Bertel Lund Hansen wrote:
> im skrev:
>
>> Brug preg_match eller anden lignende regulær match i stedet for instr.
>> (ereg, eregi)
>
> Hvis man ikke har brug for styrken i reguklære udtryk, råder
> PHP-manualen fra at man bruger de funktioner. Strpos() skulle
> være den hurtigste mulighed hvis man blot skal have svaret ja/nej
> (eller den første position).

strpos er altså ikke sundt.

F.eks. vil jeg gerne finde alle ordene "et" i en sætning... hvordan vil
du gøre det?

Der er masser af falske positive i sådanne tilfælde - som f.eks.
hus*et*, *et*ablere, *et*age... ligesom f.eks. finde alle "en" vil give
falske positive på f.eks. *en*g osv..


--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk

Bertel Lund Hansen (12-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-08-07 00:18

Johan Holst Nielsen skrev:

> strpos er altså ikke sundt.

Det lyder som om der er noget programmæssigt galt med den. Det er
der ikke.

> F.eks. vil jeg gerne finde alle ordene "et" i en sætning... hvordan vil
> du gøre det?

   strpos($text,' et ');

Hvis du også vil have dem med der indleder en sætning, må du
supplere med strpos($text,'Et ');.

Men nu skrev jeg altså også: Hvis man ikke har brug for styrken i
regulære udtryk ...

Jeg sagde ikke at man aldrig skulle bruge det.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Johan Holst Nielsen (12-08-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 12-08-07 10:06

Bertel Lund Hansen wrote:
> Johan Holst Nielsen skrev:
>
>> strpos er altså ikke sundt.
>
> Det lyder som om der er noget programmæssigt galt med den. Det er
> der ikke.

Jah, måske lidt forkert formulering. Men mener heller ikke det er korrekt.

>
>> F.eks. vil jeg gerne finde alle ordene "et" i en sætning... hvordan vil
>> du gøre det?
>
>    strpos($text,' et ');

Hjælper intet, hvis der f.eks. er et komma, punktum, udråbstegn,
spørgsmåltegn, kolon, semikolon osv. efter tegnet.

> Hvis du også vil have dem med der indleder en sætning, må du
> supplere med strpos($text,'Et ');.

Det er bare en bøvlet måde at gøre det på. Og er efter min mening langt
fra godt at lære folk (selvfølgelig afhængig af situationen). Hvis det
er en sætning der skal matches så er der rigtig mange muligheder

" et "
"Et "
" et."
" et,"
" et!"
" et?"
" et:"
" et;"

Vil du så lave 8 strpos for hver? Faktisk (med mindre det blot er
boolean value man er ude efter - så kan man lave en strtolower eller
bruge stripos) - så skulle du også lave "Et?" og "Et!" osv. Lige
pludselig er det næsten hurtigere at læse hele bogen om grundlæggende
regular expressions end at forsøge at snyde sig udenom dem.

> Men nu skrev jeg altså også: Hvis man ikke har brug for styrken i
> regulære udtryk ...
>
> Jeg sagde ikke at man aldrig skulle bruge det.

Enig - alt afhænger af situation. Det så ud til Allan kunne bruge dit
script - hvilket er fint. Er blot bange for nogle kopierer det, uden at
tænke over "konsekvenserne" :)

--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk

Johan Holst Nielsen (11-08-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 11-08-07 10:25

im wrote:
> Brug preg_match eller anden lignende regulær match i stedet for instr.
> (ereg, eregi)
>
> http://dk2.php.net/preg-match

Nu forsøgte jeg blot at være lidt pædagogisk ;)

Selvfølgelig kan man bruge f.eks. ereg* preg* funktionerne til metoden
jeg beskrev. Og som Bertel skriver - så kan man alternativt tage brug af
andre funktioner til f.eks. exploden - men replace så man kun har a-z
tilbage (og evt lidt flere tegn) kan man vidst ikke undgå regulære
udtryk (med mindre man elsker at lave et meget langt array med alverdens
tegn og derefter brugt str_replace...)

Er dog stadig "imod" Bertels metode med strpos - da der er alt alt alt
for stor fejlmargin i den.

Mvh
Johan


--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk

Bertel Lund Hansen (12-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-08-07 00:20

Johan Holst Nielsen skrev:

> Er dog stadig "imod" Bertels metode med strpos - da der er alt alt alt
> for stor fejlmargin i den.

Der er ingen fejlmargin i strpos(). Den gør hvad den skal, og
hvis det er det der er brug for, er den hurtig og nem at læse.
Det sidste er en kanon fordel.

Ethvert program kan gøre noget det ikke skal, men det gør det kun
hvis man skriver det forkert.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Johan Holst Nielsen (12-08-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 12-08-07 10:07

Bertel Lund Hansen wrote:
> Johan Holst Nielsen skrev:
>
>> Er dog stadig "imod" Bertels metode med strpos - da der er alt alt alt
>> for stor fejlmargin i den.
>
> Der er ingen fejlmargin i strpos(). Den gør hvad den skal, og
> hvis det er det der er brug for, er den hurtig og nem at læse.
> Det sidste er en kanon fordel.

Det passer simpelthen ikke. Det gør det som du gerne vil have i din
verden. Men der er en fejlmargin eftersom alle ord kan slutte med
special tegn. Gider ikke beskrive det igen - men læs:

<46becd7e$0$90264$14726298@news.sunsite.dk>


--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk

Bertel Lund Hansen (12-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-08-07 10:55

Johan Holst Nielsen skrev:

> Det passer simpelthen ikke. Det gør det som du gerne vil have i din
> verden.

Du misforstår. Programkoden gør altid præcis hvad den skal
medmindre der er fejl i compileren. Den gør ikke altid det som
programmøren ønskede.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Johan Holst Nielsen (12-08-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 12-08-07 11:07

Bertel Lund Hansen wrote:
> Johan Holst Nielsen skrev:
>
>> Det passer simpelthen ikke. Det gør det som du gerne vil have i din
>> verden.
>
> Du misforstår. Programkoden gør altid præcis hvad den skal
> medmindre der er fejl i compileren. Den gør ikke altid det som
> programmøren ønskede.

Aaah - sorry... jeg beklager. Men det her handler mere om rent
flueknepning på at jeg bruge et forkert ord.

EOD

--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk

Allan Kok (11-08-2007)
Kommentar
Fra : Allan Kok


Dato : 11-08-07 21:01


"Allan Kok" <allan.kok@fabel.dk> skrev i en meddelelse
news:46bca70e$0$90267$14726298@news.sunsite.dk...
> Jeg har en tekst, og et array med ord.
>
> Jeg kan så finde udaf om et af ordene indgår i teksten. Skal jeg lave
> noget med strpos med hver ord for at se om det indgår, eller er der en
> smart funktion der kan?
>

Jeg har laver programstumpen, jeg brugte strpos, velvidende det problem som
Johan omtaler. Men det er ikke et problem i min situation

mvh
Allan



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

Månedens bedste
Årets bedste
Sidste års bedste