Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [perl] Hoe vaak komt een karakterreeks voor? (https://forum.scholieren.com/showthread.php?t=179960)

eddie 07-08-2002 18:47

[perl] Hoe vaak komt een karakterreeks voor?
 
Ik wil tellen (oid) hoevaak een karakterreeks voorkomt.

Is daar een functie voor?
Of moet ik er achter komen via een omweg? ( eerst de 'vervangen'-opdracht geven, dan weet ik hoeveel hij er heeft vervangen, en dan weer terugzetten, om ze daarna eventueel weer te gaan vervangen)

TouchOfDarkness 07-08-2002 19:54

hmm kzou zeggen zoek de positie op van de eerste keer dat je die reeks tegenkomt, laat daarbij een teller lopen hoe vaak je een match hebt...

als je nou een hit hebt, neem dan voor die functie als input de tekst minus het stuk tot en met de hit. zo kan je recursief het hele blokje tekst doorzoeken

eddie 07-08-2002 19:57

ja... maar dan moet ik het nog zelf schrijven. Is er geen standaard functie voor?

Chip Zero 07-08-2002 20:56

Ik weet van geen standaardfunctie die dit doet. Ik zou het gewoon zo doen:
Code:

sub aantal {
  $_ = $_[0]; my $i;
  for ($i=0; /bla/; $i++) {
    $_ = $';
  }
  return $i;
}

Of: wat TouchOfDarkness zegt :)

eddie 07-08-2002 22:19

ok :)

Maar kan ik het ook zo maken dat ik dit allemaal hetzelfde is:
Code:

$aantal = strcnt/'abcdefga'/'a'/gi;

$string = 'abcdefga';
$aantal = strcnt/$string/'a'/gi;

$string = 'abcdefga';
$aantal = ( $string =~ strcnt/'a'/gi);

Waarbij de g staat voor globaal, en de i voor case-insensitive.

?

Chip Zero 08-08-2002 08:03

Umm... je zou zoiets kunnen doen:
Code:

$test =~ s/.*?bla.*?/1/gi;
$aantal = length $test;

Is korter, maar of het sneller is dan de stap-voor-stap methode is maar de vraag.

eddie 08-08-2002 11:58

dan is dit beter (denk ik):
Code:

$aantal = ($test =~ s/.*?bla.*?/1/gi);
Maar je vervangt de PATTERN met 1 ?? Waar is dat voor?

Chip Zero 08-08-2002 14:30

Mijn bedoeling is om overal die string "bla" met eventuele andere strings eromheen (die worden afgevangen door .*?) te vervangen door één karakter, hier het cijfer 1. Als je dan "bladieblabla" behandelt, dan krijg je dus "111" (=lengte 3; 3 keer bla). Alleen bij strings waar die "bla" helemaal niet in voorkomt loopt dit fout, dus je moet wel van te voren controleren of "bla" sowieso wel in de string voorkomt...

eddie 08-08-2002 14:46

Ach zoo. :)

Maar ik wil eigenlijk de oorspronkelijke tekst niet veranderen...

Je kan dus ook het volgende doen:
Code:

$tekst = "abcdefa";
$aantal = ( $tekst =~ s/'a'/'443DfEesw'/g );
$tekst =~ s/'443DfEesw'/'a'/g;

Is dat sneller, of niet?

Chip Zero 08-08-2002 18:38

Dit werkt ook:
Code:

$tekst = "abcdefa";
$aantal = $tekst =~ s/a/a/g;

Dat lijkt me tot nu toe het snelst ;)

eddie 08-08-2002 18:39

Hmm... aangezien mijn huidige probleem ook onder Perl valt, zet ik het hier maar neer :)

Ik heb een functie (change_date) die de datum moet omzetten van '2002-08-07 19:38:32' (dus yyyy-mm-dd hh:mm:ss) naar, je raad het al: '07-08-2002 19:38:32'.

Dit heb ik gedaan, maar werkt niet :(
Code:

sub change_date
{
  /(.{4})-(.{2})-(.{2})/;
  return join( '-', $3, $2, $1 ) . $';
}

Wat doe ik fout? (of wat gaat hier fout ;))

eddie 08-08-2002 18:41

Citaat:

Chip Zero schreef:
Dit werkt ook:
Code:

$tekst = "abcdefa";
$aantal = $tekst =~ s/a/a/g;

Dat lijkt me tot nu toe het snelst ;)

ah, ok! ;)

Chip Zero 08-08-2002 18:47

Citaat:

eddie schreef:
Code:

sub change_date
{
  /(.{4})-(.{2})-(.{2})/;
  return join( '-', $3, $2, $1 ) . $';
}

Wat doe ik fout? (of wat gaat hier fout ;))

Whoa! Dat zou ik gewoon zo doen:
Code:

s/(....)-(..)-(..)(.*)/$3-$2-$1$4/;

eddie 08-08-2002 18:53

Citaat:

Chip Zero schreef:
Whoa! Dat zou ik gewoon zo doen:
Code:

s/(....)-(..)-(..)(.*)/$3-$2-$1$4/;

Ach ja! Natuurlijk! :)

eddie 08-08-2002 18:58

Okeee... wat klopt er niet?
Code:

$dPostDatum = &change_date( $dPostDatum );

...

sub change_date
{
 s/(....)-(..)-(..)(.*)/$3-$2-$1$4/;
 return $_;
}

Geeft niks terug :confused:

Kan ik trouwens ook doen
Code:


$dPostDatum =~ &change_date();

?

Chip Zero 08-08-2002 19:39

Dat moet dus zijn:
Code:

$dPostDatum = change_date($dPostDatum); #mag vrijwel altijd zonder &

...

sub change_date
{
 $_ = $_[0];
 s/(....)-(..)-(..)(.*)/$3-$2-$1$4/;
 return $_;
}

En...
Citaat:

eddie schreef:
Kan ik trouwens ook doen
Code:

$dPostDatum =~ &change_date();
?

...kan zo te zien niet.

eddie 08-08-2002 23:06

Hey, Chip Zero!
Het werkt! :cool:
Bedankt! :)

eddie 09-08-2002 18:03

Ik houd 'al' mijn Perl vragen maar even in één topic ;)

Ik ben dus bezig met een forum te maken. Nu wil ik, net zoals hier, dat URL's automatisch worden omgezet.
Ik heb dit:
Code:

$bericht =~ s/(.*)(\"{0})(\]{0})(={0})(http\:\/\/)(.+)( *)/$1\[url\]$5$6\[\/url\]$7/gis;
maar die werkt niet. :o

Waarom niet?

Chip Zero 09-08-2002 18:13

Bleh maak er liever een multiline regexp van, zo moet ik het helemaal ontcijferen.

Anyways, door die $7 not-greedy te maken en wat andere veranderingen lijkt het nu wel te werken:
Code:

$bericht =~ s!(.*)(\"{0})(\]{0})(={0})(http\://)(.*?)\s!$1\[url\]$5$6\[/url\] $7!gis;
Er moet alleen wel een spatie achteraan 't bericht anders werkt 't niet :-/

eddie 09-08-2002 18:18

Citaat:

Chip Zero schreef:
Bleh maak er liever een multiline regexp van, zo moet ik het helemaal ontcijferen.

Anyways, door die $7 not-greedy te maken en wat andere veranderingen lijkt het nu wel te werken

Er moet alleen wel een spatie achteraan 't bericht anders werkt 't niet :-/

multiline regexp :confused: :o

Hoe maak ik iets not-greedy dan?

(btw, hij doet het niet :/)

Chip Zero 09-08-2002 18:25

Code:

$bericht = "bericht http://www.huiswerkservice.nl bericht";

$bericht =~ s!(.*)(\"{0})(\]{0})(={0}) #rommel
  (http://) #$5
  (.*?) #rest van url ($6)
  \s
  !$1\[url\]$5$6\[/url\] $7!gisx; #<= deze x maakt 't een multiline regexp

print $bericht;

Die "rest van url" is dus not-greedy, door dat vraagteken erachter. Normaal gesproken is .* greedy, dus probeert 't een zo lang mogelijke string te matchen. *? is niet greedy, en probeert een zo kort mogelijke string te matchen. Lastig uit te leggen maar als je ermee experimenteert kom je er wel achter...

De fout in mijn code hierboven is dus vooralsnog dat 't alleen met berichten met een spatie achter de url werkt. Ik had wat andere dingen geprobeert maar dat lukte niet echt...

eddie 09-08-2002 18:30

:o Weet al waarom hij het niet deed :o
de '/' is een hex-waarde in het bericht :o

Chip Zero 09-08-2002 18:33

Citaat:

eddie schreef:
:o Weet al waarom hij het niet deed :o
de '/' is een hex-waarde in het bericht :o

He wat? Hij doet 't nu dus? Jammer, ik had 'm hier net aan het werk gekregen...

eddie 09-08-2002 18:35

Citaat:

Chip Zero schreef:
He wat? Hij doet 't nu dus? Jammer, ik had 'm hier net aan het werk gekregen...
Nee, hij doet het hier nog niet :p :o

Alleen waar een spatie voor en achter staat, doet hij :confused:

Chip Zero 09-08-2002 18:39

Het is niet echt optimaal op deze manier, maar 't werkt (of dat denk ik tenminste):
Code:

$bericht = "bericht http://www.huiswerkservice.nl bericht";

$bericht =~ s!(.*)(\"{0})(\]{0})(={0}) #rommel
  (http://) #$5
  ((.*?) #rest van url ($6)
  ([^\w/.])
  |(.*))
  !$1\[url\]$5$7$9\[/url\]$8!gisx;

print $bericht;


eddie 09-08-2002 18:47

Alleen ik zit met hex-code :(

Code:

$bericht =~ s
!(.*?)(\"{0})(\]{0})(={0}) # $1-$4
 (http\%3A\%2F\%2F) # $5
 (.+) #$6
 ((\%0D\%0A)*|(\%20)*) #$7-$8
!$1\[url\]$5$6\[\/url\]$7$8
!gisx;

Ofzo.

%0D%0A is het nl/cr teken.
%20 is spatie.

Deze mogen dus ook vaker voorkomen achter elkaar
:(

Chip Zero 10-08-2002 10:05

Als ik aan zoiets begin dan wil ik het ook wel afmaken. Gisteren had ik het nog even geprobeert met een bericht met twee urls, en dat werkte voor geen meter. Ik heb het nu verder afgemaakt gebaseerd op mijn vorige code:
Code:

$bericht = "bericht http://www.huiswerkservice.nl bericht http://www.iets-heel%20anders.nl/";

$bericht =~ s!#(.*)(\"{0})(\]{0})(={0}) #werkt gewoon zonder ({0} is *minimaal* nul)
  (http://) #$1
  ((.*?) #begin van $2, $3
  ([^\w/.%-]) #$4
  |(.*)) #$5 en einde van $2
  !\[url\]$3$5\[/url\]$4!gisx;

print $bericht;
#output: bericht [url]www.huiswerkservice.nl[/url] bericht [url]www.iets-heel%20anders.nl/[/url]


eddie 10-08-2002 12:09

Helaal, Chip Zero, jij gaat er vanuit dat er spaties enzo instaan, maar omdat het uit een textarea komt, is het geconverteerd naar + (bijvoorbeeld)

Zie hier een inhoud van wat in het scriptje binnenkomt:

http%3A%2F%2Fwww.erikdokter.nl%0D%0Ahttp%3A%2F%2Fwww.erikdokter.nl+1%0 D%0A1+http%3A%2F%2Fwww.erikdokter.nl%0D%0A1+http%3A%2F%2Fwww.erikdokte r.nl+1

(zie ook http://www.erikdokter.nl/forum/?acti...opic&topicid=7)

Citaat:

{n} Match exactly n times
Ik zit ook nog met het probleem dat
Code:

[ url]http://www.erikdokter.nl[/url]
[ url=http://www.erikdokter.nl]Mijn forum[/url]
http://www.erikdokter.nl/images/blaat.gif

buiten de replace moeten vallen, vandaar de
Code:

(.*)(\"{0})(\]{0})(={0})
Heb nu
Code:

$bericht =~ s
!(\%5D{0})(\%3D{0}) # Alles wat niet voor de http:// mag komen $1-$2
 (http\%3A\%2F\%2F) # http:// zelf $3
 (.+) # de rest van de url $4
 ((\+)*) # Spatie $5
 (.*) # $6
!$1\[url\]$3$4\[/url\]$5$6
!gisx;

En doet het nog niet :(

Chip Zero 10-08-2002 12:48

In dat geval zou ik 't in ieder geval eerst url-decoden, dat gaat veel makkelijker lijkt mij. En dat {0} stuk daar heb je gelijk in, dat moet dan wel zo blijven.

eddie 10-08-2002 12:57

Citaat:

Chip Zero schreef:
In dat geval zou ik 't in ieder geval eerst url-decoden, dat gaat veel makkelijker lijkt mij.
Ik kan hem niet decoden, want dan staat hij niet goed in de database (eoln karakters enzo).

Chip Zero 10-08-2002 13:04

Dat maakt 't wel wat lastiger. Je wilt 't zeker ook niet eerst decoden en dan weer encoden? :) Dan zou ik zeggen, combineer mijn laatste versie met de jouwe en speel er wat mee...

eddie 10-08-2002 13:20

*speelt*

Chip Zero 10-08-2002 13:24

Wordt lekker groot Perl topic zo :D

eddie 10-08-2002 15:13

Whooeeii!
Heppum! Heppum! (naja... half dan :p)
Code:

$bericht =~ s
!(http\%3A\%2F\%2F) # http:// zelf $1
 (.+?) #begin van $2
 ((\ )|(\%0D\%0A)) # $3 $4
!\%5Burl\%5D$1$2\%5B/url\%5D$3$4
!gisx;

Ik gebruik een library om de url enzo om te zetten (een cgi-lib.pl, die ik niet zelf heb geschreven), en deze zette de + (spatie in text) om naar een echte spatie.

Tevens wou die functie de hexwaardes omzetten naar normale waarden, en daarna de html-tags eruit filteren.

De eikel! :mad: :p

Nu alleen nog dat van een paar posts terug verwerken (met die url en img tags) en het is klaar :) :)

*blij*

Chip Zero 10-08-2002 15:51

D'r is wel zo'n standaardfunctie voor maar ik heb nooit zin om die op te zoeken. In plaats kopiëer ik de volgende subs uit een oud script:
Code:

sub url_encode {
  my($text)  = $_[0];    # text to URL encode
  $text =~ tr/ /+/;    # replace " " with "+"
  $text =~ s/[^A-Za-z0-9\+\*\.\@\_\-]/  # replace odd chars
            uc sprintf("%%%02x",ord($&))/egxo;  #  with %hex value
  return $text;      # return URL encoded text
}

sub url_decode {
  my($t)  = $_[0];    # URL encoded text to decode
  $t =~ tr/+/ /;    # replace "+" with " "
  $t =~ s/%([A-F0-9]{2})/pack("C", hex($1))/egio; # replace %hex with chars
  return $t;      # return decoded plain text
}

sub url_encode_full { #encode aangepast om alle chars om te zetten
  my($text)  = $_[0];    # text to URL encode
  $text =~ tr/ /+/;    # replace " " with "+"
  $text =~ s/./  # replace *all* chars
            uc sprintf("%%%02x",ord($&))/egxo;  #  with %hex value
  return $text;      # return URL encoded text
}

Die had ik ooit eens ergens gevonden. Die laatste is ook wel grappig...

eddie 12-08-2002 17:00

Hmm... Ik zit nu met het volgende probleem.

Als ik de string
'[ url]http://www.erikdokter.nl[/url]' (wel zonder spaties;)), krijg ik
Code:

<a href="" title="http://http://www.erikdokter.nl" onclick="window.open('http://http://www.erikdokter.nl', '_window');">http://www.erikdokter.nl</a>
Zoals je ziet, staat er 2 keer http:// in.
Ik gebruik de volgende replace functie:
Code:

$cTekst =~ s
 !(\[url\]) # Begin url $1
  ([http\://]??) # Eventueel http:// strippen $2
  (.+?) # url $3
  (\[/url\]) # Eind url $4
 !\<a href=\"\" title=\"http\://$3\" onclick=\"window\.open\(\'http\://$3\', \'_window\'\);\"\>$3\</a\>
 !gisx;

Ik wil ook dat hij werkt als ik de string
'[ url]www.erikdokter.nl[/url]'
heb. Vandaar dat http:// optioneel moet zijn (met ?? dacht ik...(of ?, of {0, 1}))

Chip Zero 12-08-2002 17:14

Citaat:

Als ik de string
'[ url]http://www.erikdokter.nl[/url]' (wel zonder spaties ), krijg ik

[url]http://www.huiswerkservice.nl[/url] dus ;)
Code:

$cTekst =~ s
 !(\[url\]) # Begin url $1 <= dat hoeft toch geen $1 te zijn?
  (http://)?# Eventueel http:// strippen $2 <= vierkante haken stonden compleet verkeerd, dan zou het maar één teken zijn
  (.+?) # url $3
  (\[/url\]) # Eind url $4
 !\<a href=\"\" title=\"http\://$3\" onclick=\"window\.open\('http\://$3', '_window'\);\"\>$3\</a\>
 !gisx;


eddie 12-08-2002 17:20

Citaat:

Chip Zero schreef:
dat hoeft toch geen $1 te zijn?

Nee, maar dat is het wel... ;) (is toch de eerste search-pattern. En die krijgt toch $1???)

Citaat:

Chip Zero schreef:

vierkante haken stonden compleet verkeerd, dan zou het maar één teken zijn

Jaaa, ik weet die betekenissen ook niet van die [] dingen :o

Dank:)

Chip Zero 12-08-2002 17:24

Citaat:

eddie schreef:

Nee, maar dat is het wel... ;) (is toch de eerste search-pattern. En die krijgt toch $1???)

Ja maar als je die haakjes er omheen gewoon weglaat is het volgende omhaakte stuk $1. Je hebt die haakjes alleen nodig als je zo'n stuk dan als $1 ofzo wilt gebruiken of soms om | te gebruiken, of zoals bij dat http:// stuk om tekst bij elkaar te houden voor een ? of een * ofzo.

eddie 12-08-2002 17:27

Citaat:

Chip Zero schreef:
Ja maar als je die haakjes er omheen gewoon weglaat is het volgende omhaakte stuk $1. Je hebt die haakjes alleen nodig als je zo'n stuk dan als $1 ofzo wilt gebruiken of soms om | te gebruiken, of zoals bij dat http:// stuk om tekst bij elkaar te houden voor een ? of een * ofzo.
Ooooow :)

Weer wat geleerd :)

eddie 12-08-2002 17:43

Stomme PATTERNS ook...
Jemig.

Er mag geen spatie komen na een [img]-tag...
Code:

$cTekst =~ s
 !\[img\]# Begin image
  \ {0}# Geen spatie ?
  (http\://)?# Eventueel http:// strippen $1
  (.+?)# url $2
  \[/img\]# Eind image
 !\<img src=\"http\://$2\" alt=\"Plaatje niet gevonden\" title=\"http\://$2\" />
 !gisx;

Doet het niet...

\s{0} doet het ook niet...

Chip Zero 12-08-2002 17:49

Kijk, een string met lengte nul is géén spatie, daar werkt dat niet denk ik. Je moet dus zorgen dat die $1 hier géén spatie kan zijn ([^\s] is een verzameling van alle tekens behalve spaties).

eddie 12-08-2002 17:59

hoe moet hij dan worden??
Ik kom er niet uit :(

Chip Zero 12-08-2002 18:03

Umm waar ik $1 zei bedoelde ik dus $2. Maar dit moet 't dus worden:
Code:

$cTekst =~ s
 !\[img\]# Begin image
  (http\://)?# Eventueel http:// strippen $1
  ([^\s]+?)# url $2
  \[/img\]# Eind image
 !\<img src=\"http\://$2\" alt=\"Plaatje niet gevonden\" title=\"http\://$2\" />
 !gisx;


eddie 12-08-2002 18:07

http://images.tweakers.net/forum/smileys/worshippy.gif

Chip Zero 12-08-2002 18:12

Weet je wat, maak er bij nader inzien maar dit van:
([^\s].*?)
Dan accepteert 'ie ook urls met spaties binnenin...

Wat voor editor gebruik jij eigenlijk?

eddie 12-08-2002 18:22

Citaat:

Chip Zero schreef:
Weet je wat, maak er bij nader inzien maar dit van:
([^\s].*?)
Dan accepteert 'ie ook urls met spaties binnenin...

Hmm... Dan kan de url toch ook niks zijn?? (dus alleen maar http://, verder niks?)
Citaat:

Chip Zero schreef:

Wat voor editor gebruik jij eigenlijk?

Edit Plus 2.11 natuurlijk :)

Citaat:

Syntax highlighting for HTML, CSS, PHP, ASP, Perl, C/C++, Java, JavaScript and VBScript. Also, it can be extended for other programming languages based on custom syntax files.
Super! (y)

Chip Zero 12-08-2002 18:34

Citaat:

eddie schreef:
Hmm... Dan kan de url toch ook niks zijn?? (dus alleen maar http://, verder niks?)
Dan krijg je <img src="http://http://" alt="Plaatje niet gevonden" title="http://http://" />". Is dat rampzalig?

Wat ik me net bedenk trouwens, je moet er éigenlijk ook nog zorgen dat er geen javascript: urls worden toegestaan, een soort van bug in IE die dat dan gewoon uitvoert. Aan de andere kant, als ik jouw site in IE bekijk, misschien hoeft dat misschien ook weer niet ;)
Citaat:

Edit Plus 2.11 natuurlijk :)
Ik had al zo'n vermoeden :) Ik gebruik zelf tegenwoordig meestal Dzsoft Perl Editor, waarmee ik de uitvoer van het script ook meteen kan zien (ook met de ingebouwde IE viewer). Handig om dit soort dingetjes snel mee te proberen.
Citaat:

(editplus)
Super!(y)
Ik ken 't wel, heb het zelf wel gebruikt voor de taal Haskell. Daar waren ook syntax files voor beschikbaar...

eddie 12-08-2002 18:45

Citaat:

Chip Zero schreef:
Dan krijg je <img src="http://http://" alt="Plaatje niet gevonden" title="http://http://" />". Is dat rampzalig?

Neuh...
Citaat:

Chip Zero schreef:

Wat ik me net bedenk trouwens, je moet er éigenlijk ook nog zorgen dat er geen javascript: urls worden toegestaan, een soort van bug in IE die dat dan gewoon uitvoert. Aan de andere kant, als ik jouw site in IE bekijk, misschien hoeft dat misschien ook weer niet ;)

Ghegheghe! :D
Wel een goeie trouwens. Zal ik eens naar kijken :)
Citaat:

Chip Zero schreef:

Ik gebruik zelf tegenwoordig meestal Dzsoft Perl Editor, waarmee ik de uitvoer van het script ook meteen kan zien (ook met de ingebouwde IE viewer). Handig om dit soort dingetjes snel mee te proberen.

Dat kan ook in Edit Plus (kwam ik net achter :o)

Chip Zero 12-08-2002 18:56

Citaat:

eddie schreef:
Ghegheghe! :D
Wel een goeie trouwens. Zal ik eens naar kijken :)

Werkt op erg veel forums. Worden cookies mee gestolen en dingen als javascript:while(1){alert('hallo')} mee gedaan :) (raar trouwens hoe dit forum "javascript" automatisch omzet in "java script")
Citaat:

Dat kan ook in Edit Plus (kwam ik net achter :o)
Ja? Da's pretty goed. Maar heeft 't ook geintegreerde Perl help? Quick insert code snippets (vast wel)? En vooral: step-by-step debugging? En 't watchen van variabelen? Al is Perl Builder daar weer wat sterker in dan Perl Editor. Ik gebruik ze eigenlijk allebei, maar Perl Editor werkt toch wat lekkerder.


Alle tijden zijn GMT +1. Het is nu 21:07.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.