Just nu i M3-nätverket
Gå till innehåll

Plocka ut boksträver ur sträng.


Jonas Jönsson

Rekommendera Poster

Jonas Jönsson

Hej!

 

Jag skulle vilja plocka ut bokstäver ut en sträng. Det som ska plockas ut är första vokalen och det som står efter. Så resultatet från ordet hoppsan bör bli:

oppsan

 

och hejsan = ejsan.

 

Jag gissar att man ska använda substr tillsammans med en for-loop icg en if-sats (kanske?) men jag vet inte riktigt hur.

 

Nån som har tips?

 

Länk till kommentar
Dela på andra webbplatser

PHP har ju ingen aning om vad som är vokaler och konsonanter, så för det första måste du ange detta.

Sedan är det bara att göra en sökning i strängen efter positionen av den första vokalen, och plocka ut allt därifrån med substr() precis som du säger.

 

Dock är inte detta en lösning jag nöjer mig med, utan jag föredrar att göra saker och ting mer komplicerade, nämligen med reguljära uttryck.

$vokaler = "aeiouyåäö";
$strang = "hejsan";
$ny = preg_replace("/^[^" . quotemeta($vokaler) . "]*(.*)$/i", "\\1", $strang);
echo $ny;

 

Länk till kommentar
Dela på andra webbplatser

Jonas Jönsson

Herrejäklar vad du é snabb! O tänk så mkt du har hjälpt mig! :-)

 

Än så länge föredrar jag att hålla mig till de mindre komplicerade bitarna. Jag förstod inte ens det du skrev. En massa tecken huller om buller bara :-)

 

Vad innehåller $ny nu? *känner mig jäkligt trög ska du veta*

 

Länk till kommentar
Dela på andra webbplatser

Om du testar koden så kommer du se att $ny innehåller "ejsan".

 

Sök efter "reguljära uttryck" här på Eforum så finns det en del inlägg där jag förklarat mer vad det är och hur de fungerar.

 

Kort sagt kan man säga att det är ett avancerat mösnter, efter hur en textsträng matchas, och delas upp i mindre delar.

 

I detta exempel kollar vi först att det är början av strängen: ^

Sedan om det finns några konsonanter (= ej vokaler, ^ betyder 'inte'): [^aeiouyåäö]

Och till sist en grupp () som matchar alla tecken, hur många gånger som helst, altså resten av strängen: (.*)

 

Sedan ersätter vi hela strängen med det som står i andra argumentet "\\1", där \\1 är en bakåtrefererare till gruppen vi skapade i det första argumentet med ().

 

Men sök som sagt här på Eforum så finns det en hel del matnyttigt...

 

Länk till kommentar
Dela på andra webbplatser

Jonas Jönsson

Tack, du är en klippa! :-)

 

Ursäkta att jag inte testade den innan jag frågade. Skulle jag förstås gjort. Blev bara så förvirrad och tänkte att "det där klarar jag aldrig". Borde kanske försöka höja mitt självförtroende litta.

 

O jag ska söka rundor på Eforum så att jag lär mig de här uttrycken. Kan vara bra!

 

Aja, nu ska jag väl klara göra resten. Bör inte vara några problem!

 

EDIT: Som du kanske förstår är det fortfarande mitt lilla rimlexikon jag jobbar med. Det börjar arta sig. När det är helt klart ska jag minsann skicka adressen till dig så att du får se vad du har bidragit till!

 

// Jonas

[inlägget ändrat 2003-05-21 14:13:22 av Jonas Jönsson]

Länk till kommentar
Dela på andra webbplatser

Som du kanske förstår är det fortfarande mitt lilla rimlexikon jag jobbar med. Det börjar arta sig. När det är helt klart ska jag minsann skicka adressen till dig så att du får se vad du har bidragit till!
Låter bra det...

Jag har faktiskt också en gång i tiden funderat på ett liknande lexikon, och även ett där man kan ange bara längden på orden, och sedan fylla i några enstaka ord här och där, så får man fram träffar.

 

Skulle nog vara bra för de som löser korsord. Själv vet jag inte vad jag ska ha dem till, då jag varken skriver poesi eller löser korsord ;)

 

Kanske komemr väl till pass när man försöker komma på sångtexter dock...

 

Länk till kommentar
Dela på andra webbplatser

Jonas Jönsson

Sångtexter är inte att förkasta nä. Det var så jag började med poesi!

 

Korsordslexikon är en jäkligt bra idé, tycker jag! Ett sånt får du göra! Inte för att jag heller löser korsord, men ändå! :-)

 

Jag tror nog att det mesta ska vara klart nu. Några småändringar kanske det blir. Tyvärr är inte domänen igång ännu men du hittar sidan på http://www.javisst.net/ojsan/. Säg gärna till om du ser ngt konstigt!

 

EDIT: Än så länge finns det bara 15 ord inlagda så du får söka på ngt som slutar på -ur :-)

 

[inlägget ändrat 2003-05-21 17:19:10 av Jonas Jönsson]

Länk till kommentar
Dela på andra webbplatser

Korsordslexikon är en jäkligt bra idé, tycker jag!
Jag håller med. Iofs är det roligare att lösa utan att "fuska", men men...

 

Det svåra måste dock vara att samla ord, fast det kan man kanske kopiera från någon ordlista?

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

Jonas Jönsson

Visst vill man kunna själv, fast ibland säger hjärnan stopp, tyvärr. Som när man skriver php :-/

 

Kanske går att kopiera ngnstans ifrån, men jag har inte hittat nåt. Annars kan man ju göra en egen liten funktion där man klistrar in en lång text och koden plockar ut alla unika ord och placerar dem i en egen post. Bör väl inte vara nåt problem (för er två alltså, jag hade nog fått kämpa länge).

 

Länk till kommentar
Dela på andra webbplatser

En bra svenska ordlista finns på Internet (med en massa gramatiska böjningar osv för ord också, så man kan även rimma på dessa).

 

Du får titta på formatet på databasen, och sedan skriva något skript som läser in dessa till en databas.

 

"Den stora svenska ordlistan"

http://217.215.213.10/

 

Gå till "Hämta filer", och ladda ned dsso-x.x.tar.

 

Jag tycker din sida ser jättebra ut! Jag gillar upplägget och färgerna.

 

Sedan har jag en liten idé/önskan.

Skulle du inte kunna försöka dela upp orden i stavelser? Det är ju ofta så man rimmar, nämligen den sista, eller två sista stavelserna. Om du kommer på en algoritm för att dela upp en ord i stavelser kan man ju även använda det till att avstava en text, vilket är en funktion som jag ofta behöver och inte finns att tillgå.

 

Jag påbörjade ett sådant projekt en gång, men fick så mycket annant arbete att jag inte hann gräva speciellt djupt.

Dock har jag förstått att avstavning är individuellt för varje ord, och att det inte finns några exakta specifikationer för hur ord ska avstavas.

 

Men om man bara hade en funktion som delade upp ordet i stavelser kan man applicera några enklare kontroller på dessa (avstava vid dubbelkonsonant exempelvis), och göra någon slags "fattigmans-avstavning".

 

Jag är till och med beredd att betala för en sådan funktion...

 

Länk till kommentar
Dela på andra webbplatser

"Den stora svenska ordlistan"

http://217.215.213.10/

Då är det ju en barnlek att göra ett stort korsords- alt rimlexikon.

 

Jag tycker din sida ser jättebra ut! Jag gillar upplägget och färgerna.
Jag håller med. Den såg snygg ut.

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

Jonas Jönsson

Jag kommer inte in på http://217.215.213.10/. "Sidan kan inte visas". Va störigt. Det är väldigt, väldigt, väldigt få, men dock... vissa sidor kommer jag inte in på utan att koppla ur vår router. www.clasohlsson.se t.ex. Har ni kanske nån aning om vad som kan vara fel? Det går alldeles utmärkt om man surfar utan routern.

 

Att avstava hade ju inte varit så dumt kanske. Man skulle kunna göra som så att användarna får välja om de vill avstava eller inte. Men hur det systemet skulle se ut är väl desto jobbigare att komma på. Hade säkert gått att göra nån, som du kallar det, fattigmansavstavning, men mina programmeringskunskaper skulle inte räcka till än på ett tag.

 

Tack båda två för berömmet för sidan! :-) Ni har faktiskt båda en stor del i den eftersom ni har hjälpt mig mkt med att koda php. Annars hade den inte varit klar än på nåt år :-)

 

Länk till kommentar
Dela på andra webbplatser

Försök igen. Testa tryck på Uppdatera.

Ibland kommer jag inte heller in på en massa sidor, men det är monopol-Telias fel (som har undermåliga DNSer).

Annars har jag lagt upp den här, så du kan testa ladda ned:

217.70.33.39/dsso-1.1.tar.gz

 

Att göra stavelseuppdelningen går nog inte riktigt på samma sätt som ovan (alltså med reguljära uttryck), utan man får lösa det med nån for-loop eller så.

 

Man får nog lägga in en del regler med bokstavsföljder, och även leta efter vokal/konsonant-kombinationer.

 

Du kommer nog lära dig en hel del programmering under tiden, så det är bara att sätta igång fortast möjligt ;)

 

Länk till kommentar
Dela på andra webbplatser

Jonas Jönsson

Tack, det var väldigt snällt men nu har jag redan kopplat förbi routern och laddat hem filen :-) Det är alltså helt klart routern som blockerar några få sidor. skumt.

 

men nu ska jag bara få över ordlistan till databasen. hur det ska gå till har jag inte en jäkla aning om men jag ska titta på det innan jag frågar om hjälp :-)

 

Kanske är avstavningen något som jag tar tag i senare, för visst vore det ganska kul att ha "nåt att bita i". Men först har jag en del annat att göra.

 

EDIT: Tittat på filen... Har ärligt talat inte en aning om hur det skulle gå till. Hur ska man hämta dem och samtidigt skilja orden åt egentligen?

[inlägget ändrat 2003-05-21 19:07:01 av Jonas Jönsson]

Länk till kommentar
Dela på andra webbplatser

men nu ska jag bara få över ordlistan till databasen. hur det ska gå till har jag inte en jäkla aning om men jag ska titta på det innan jag frågar om hjälp :-)
Jag har ett färdigt script som jag skrev för några minuter sedan, så det är bara säga till om du inte fixar det själv. Vill du ha en färdig lösning eller vill du försöka själv? ;)

 

 

_________

TicoRoman - Anfall är bästa försvar

 

[inlägget ändrat 2003-05-21 19:42:01 av TicoRoman]

Länk till kommentar
Dela på andra webbplatser

Jonas Jönsson

hur gjorde du det så snabbt? :-)

 

hur la du in ordlistan egentligen? det skulle jag verkligen vilja veta.

 

Länk till kommentar
Dela på andra webbplatser

hur gjorde du det så snabbt? :-)
Så snabbt var det inte, tog ju en hel halvtimme ;)

 

hur la du in ordlistan egentligen? det skulle jag verkligen vilja veta.
Okej, här kommer scriptet (det är kanske inte så bra skrivet, men det fungerar):
<?php

mysql_connect ("localhost", "xxx", "xxx");
mysql_select_db ("korsord");

$filnamn = 'ordformer.txt';
$fil = fopen($filnamn, 'r');


while (!feof ($fil)) {
   $rad = fgets($fil, 4096);
   if (substr($rad,0,1) != "#" && strlen($rad) != 1)
   {
   	mysql_query("insert into ordlista (ord) values ('".substr($rad,2,strlen($rad)-1)."')");
   }
}

fclose($fil);

?>

 

Databasdesign:

CREATE TABLE ordlista (
 id int(10) unsigned NOT NULL auto_increment,
 ord tinytext NOT NULL,
 PRIMARY KEY  (id)
) TYPE=MyISAM;

 

 

_________

TicoRoman - Anfall är bästa försvar

 

[inlägget ändrat 2003-05-21 20:02:47 av TicoRoman]

Länk till kommentar
Dela på andra webbplatser

Ser jättefint ut!

Tro du inte att du kan lägga upp själva sökskriptet som en .phps fil också, och länka till denna från sok_ord.php, så intresserade kan se hur du gjort?

 

En och annan kanske kan komma med lite optimeringar och förbättringar också... ;)

 

Tänk bara på att flytta ut lösenord och användarnamn till en extern fil som du inkluderar (och inte visar källan för).

 

Länk till kommentar
Dela på andra webbplatser

Det är nästan bättre att läsa in den andra textfilen, den som innehåller alla böjningsformer också...

 

Då blir inläsningsskriptet lite mer komplicerat, men passar ändamålet bättre (korsord - är inte alltid grundformen).

 

Sedan behöver inte `ord`-kolumnen i databasen vara av typen TINYTEXT, utan VARCHAR duger lika bra (inga svenska ord är över 255 tecken ändå).

 

Länk till kommentar
Dela på andra webbplatser

Tro du inte att du kan lägga upp själva sökskriptet som en .phps fil också, och länka till denna från sok_ord.php
Sure, fixat nu.

 

En och annan kanske kan komma med lite optimeringar och förbättringar också... ;)
Jo, som jag sa så finns det ingen felhantering överhuvudtaget. Sedan är det långt ifrån optimerat. Ha kul med optimeringarna och förbättringarna. ;)

 

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

Det är nästan bättre att läsa in den andra textfilen, den som innehåller alla böjningsformer också...
Be my guest. :)

 

Undrar om jag ens läst in den andra rätt. Ser nu att det finns 325 559 ord i databasen. Är det så många verkligen?

 

Vid närmare eftertanke så ska det vara så många ord. Blev lite förvånad när jag fick ca 45 000 från den andra filen, fast det var nog fel i scriptet.

 

_________

TicoRoman - Anfall är bästa försvar

 

[inlägget ändrat 2003-05-21 20:15:29 av TicoRoman]

[inlägget ändrat 2003-05-21 20:27:21 av TicoRoman]

Länk till kommentar
Dela på andra webbplatser

Jonas Jönsson

Tack, scriptet funkade fint men det "timeoutade" eftersom 850 poster ungefär... jag ändrade executiontime till 240 s, men den när jag testade igen stannade den ändå upp. vad kan det mer vara för fel?

 

(Varför kan saker o ting aldrig gå som jag vill?)

 

Länk till kommentar
Dela på andra webbplatser

A just det ja. Det kan ju ta lite tid innan scriptet är klar. Det är trots allt över 300 000 ord som ska plockas in.

 

Ändra max_execution_time till 0, dvs obegränsat. När scriptet är klar ändrar du tillbaka till något bättre passande värde för vanliga script.

 

Man kan styra max_execution_time direkt från PHP också, men jag kommer inte på syntaxen just nu.

 

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

Thomas Tydal

> Man kan styra max_execution_time direkt från PHP

> också, men jag kommer inte på syntaxen just nu.

 

set_time_limit(0);

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...