![]() |
[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) |
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 |
ja... maar dan moet ik het nog zelf schrijven. Is er geen standaard functie voor?
|
Ik weet van geen standaardfunctie die dit doet. Ik zou het gewoon zo doen:
Code:
sub aantal { |
ok :)
Maar kan ik het ook zo maken dat ik dit allemaal hetzelfde is: Code:
$aantal = strcnt/'abcdefga'/'a'/gi; ? |
Umm... je zou zoiets kunnen doen:
Code:
$test =~ s/.*?bla.*?/1/gi; |
dan is dit beter (denk ik):
Code:
$aantal = ($test =~ s/.*?bla.*?/1/gi); |
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...
|
Ach zoo. :)
Maar ik wil eigenlijk de oorspronkelijke tekst niet veranderen... Je kan dus ook het volgende doen: Code:
$tekst = "abcdefa"; |
Dit werkt ook:
Code:
$tekst = "abcdefa"; |
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 |
Citaat:
|
Citaat:
Code:
s/(....)-(..)-(..)(.*)/$3-$2-$1$4/; |
Citaat:
|
Okeee... wat klopt er niet?
Code:
$dPostDatum = &change_date( $dPostDatum ); Kan ik trouwens ook doen Code:
|
Dat moet dus zijn:
Code:
$dPostDatum = change_date($dPostDatum); #mag vrijwel altijd zonder & Citaat:
|
Hey, Chip Zero!
Het werkt! :cool: Bedankt! :) |
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; Waarom niet? |
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; |
Citaat:
Hoe maak ik iets not-greedy dan? (btw, hij doet het niet :/) |
Code:
$bericht = "bericht http://www.huiswerkservice.nl bericht"; 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... |
:o Weet al waarom hij het niet deed :o
de '/' is een hex-waarde in het bericht :o |
Citaat:
|
Citaat:
Alleen waar een spatie voor en achter staat, doet hij :confused: |
Het is niet echt optimaal op deze manier, maar 't werkt (of dat denk ik tenminste):
Code:
$bericht = "bericht http://www.huiswerkservice.nl bericht"; |
Alleen ik zit met hex-code :(
Code:
$bericht =~ s %0D%0A is het nl/cr teken. %20 is spatie. Deze mogen dus ook vaker voorkomen achter elkaar :( |
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/"; |
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:
Code:
[ url]http://www.erikdokter.nl[/url] Code:
(.*)(\"{0})(\]{0})(={0}) Code:
$bericht =~ s |
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.
|
Citaat:
|
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...
|
*speelt*
|
Wordt lekker groot Perl topic zo :D
|
Whooeeii!
Heppum! Heppum! (naja... half dan :p) Code:
$bericht =~ s 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* |
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 { |
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> Ik gebruik de volgende replace functie: Code:
$cTekst =~ s '[ url]www.erikdokter.nl[/url]' heb. Vandaar dat http:// optioneel moet zijn (met ?? dacht ik...(of ?, of {0, 1})) |
Citaat:
Code:
$cTekst =~ s |
Citaat:
Citaat:
Dank:) |
Citaat:
|
Citaat:
Weer wat geleerd :) |
Stomme PATTERNS ook...
Jemig. Er mag geen spatie komen na een [img]-tag... Code:
$cTekst =~ s \s{0} doet het ook niet... |
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).
|
hoe moet hij dan worden??
Ik kom er niet uit :( |
Umm waar ik $1 zei bedoelde ik dus $2. Maar dit moet 't dus worden:
Code:
$cTekst =~ s |
|
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? |
Citaat:
Citaat:
Citaat:
|
Citaat:
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:
Citaat:
|
Citaat:
Citaat:
Wel een goeie trouwens. Zal ik eens naar kijken :) Citaat:
|
Citaat:
Citaat:
|
Alle tijden zijn GMT +1. Het is nu 21:07. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.