Avatar billede michaeltryl Seniormester
05. august 2007 - 02:30 Der er 22 kommentarer og
1 løsning

fra morse til tekst

Jeg har lavet en kode som konvntere tekst til morse

f.eks.
"Hej med dig" bliver til ...././.---//--/./..-//..-/../--.//

Nu er mit problem og få det tilbage igen
jeg har forsøgt med

$fra = "...././.---//--/./..-//..-/../--.//"
$ord_der_skal_erstattes = array(
"..-",
".",
"--.",
"....",
"..",
".---",
"--",
);
$erstat_ord_med = array(
"d",
"e",
"g",
"h",
"í",
"j",
"m",
);
$fra = str_replace($ord_der_skal_erstattes, $erstat_ord_med, $fra);

echo"$fra";
men så udskrives der
"eeee e am m e ea ea ee me"
er der en som har et bud på hvordan jeg får gjort sådan at alt mellem /og/ bliver betragtet som 1 bogstav.
jeg har prøvet med "..-/", (sætte / efter alle i $ord_der_skal_erstattes) men det hjælper heller ikke. så udskrives der
.... . .--- -- . ..- ..- .. --.
Avatar billede arne_v Ekspert
05. august 2007 - 03:03 #1
En tilgang var at sortere dine arrays således at de længste morse sekvenser
kommer først:

$ord_der_skal_erstattes = array(
"....",
".---",
"..-",
"--.",
"..",
"--",
".",
);
$erstat_ord_med = array(
"h",
"j",
"d",
"g",
"í",
"m",
"e",
);
Avatar billede radion Nybegynder
05. august 2007 - 07:59 #2
en anden, dog lidt langsommere end arne_v's metode kunne være følgende:

<?

$fra = "...././.---//--/./..-//..-/../--.//"; //her manglede ';'
$ord_der_skal_erstattes = array(
"..-",
".",
"--.",
"....",
"..",
".---",
"--",
);
$erstat_ord_med = array(
"d",
"e",
"g",
"h",
"i",
"j",
"m",
);

//bygger array
$aMorsecode=explode('/',$fra);

$sOrd='';

//løber det nye array igennem, og erstatter morsekode med bogstaver
for($i=0;$i<sizeof($aMorsecode);$i++)
{
    $iPosition=array_search($aMorsecode[$i],$ord_der_skal_erstattes);
   
    if(is_numeric($iPosition))
    {
        $sOrd.=$erstat_ord_med[$iPosition];
        echo $ord_der_skal_erstattes[$iPosition]."=".$erstat_ord_med[$iPosition]."<br />";
    }
    else
    {
        //Hvis den pågældende kode ikke findes i arrayet, indsættes der et mellemrum
        $sOrd.=' ';
        echo $ord_der_skal_erstattes[$iPosition]."=".$erstat_ord_med[$iPosition]."<br />";
    }

}

echo $sOrd;
?>
Avatar billede radion Nybegynder
05. august 2007 - 08:03 #3
arg, det var lige med mine kontrolpunkter, her er koden:

<?

$fra = "...././.---//--/./..-//..-/../--.//"; //her manglede ';'
$ord_der_skal_erstattes = array("..-",".","--.","....","..",".---","--");
$erstat_ord_med = array("d","e","g","h","i","j","m");

//bygger array
$aMorsecode=explode('/',$fra);

//Den her skal vi bruge til at læse bogstaverne ind i
$sOrd='';

//løber det nye array igennem, og erstatter morsekode med bogstaver
for($i=0;$i<sizeof($aMorsecode);$i++)
{
    //finder ud af hvor i arrayet morsekoden ligger
    $iPosition=array_search($aMorsecode[$i],$ord_der_skal_erstattes);

    //Hvis positionen på morsekoden findes, tilføjer den det korresponderende bogstav til slutresultatet
    if(is_numeric($iPosition))
    {
        $sOrd.=$erstat_ord_med[$iPosition];
    }
    else
    {
        //Hvis den pågældende morsekode ikke findes i arrayet, indsættes der et mellemrum
        $sOrd.=' ';
    }
}

echo $sOrd;
?>
Avatar billede erikjacobsen Ekspert
05. august 2007 - 08:16 #4
<?

$fra = "...././.---//--/./..-//..-/../--.//";
$m = array(
  ''    => ' ',
  '..-'  => 'd',
  '.'    => 'e',
  '--.'  => 'g',
  '....' => 'h',
  '..'  => 'i',
  '.---' => 'j',
  '--'  => 'm'); // osv


$f=explode('/',$fra);
$til='';

foreach ($f as $o) {
  if (isset($m[$o])) {
    $til.=$m[$o];
  } else {
    $til.=" *** $o *** ";
  }
}
print "$til <br>";

?>
Avatar billede jakobdo Ekspert
05. august 2007 - 08:19 #5
Hvad med at bygge 2 fulde arrays op, hvor det ene har: 'a' => '.-' osv...
Og det andet har: '.-' => 'a' osv...
Og så bruge php funktionen: strtr() ?
Avatar billede erikjacobsen Ekspert
05. august 2007 - 08:37 #6
Jo, det er nemlig også en mulighed:

<?
$fra = ".... . .---  -- . ..-  ..- .. --.  ";

$m = array(
  '  '  => ' ',
  ' '    => '',
  '..-'  => 'd',
  '.'    => 'e',
  '--.'  => 'g',
  '....' => 'h',
  '..'  => 'i',
  '.---' => 'j',
  '--'  => 'm'); // osv

print strtr($fra,$m)."<br>";

?>
Avatar billede radion Nybegynder
05. august 2007 - 08:39 #7
jakobdo, det var da i hvert fald en mulighed

kan det gøres mere effektivt ( jeg tænker på wordtomorse funktionen og indsættelse af / ) end nedenstående

<?


$ord_der_skal_erstattes = array(" "=>"//","//"=>" ","d"=>"..-","e"=>".","g"=>"--.","h"=>"....","i"=>"..","j"=>".---","m"=>"--");

function MorseToWord($sMorse)
{
    global $ord_der_skal_erstattes;
    $sWords=strtr($sMorse,array_flip($ord_der_skal_erstattes));
    $sWords=str_replace('/','',$sWords);
    return $sWords;
}

function WordtoMorse($sWords)
{
    global $ord_der_skal_erstattes;
    $sNewWords="";
    for($i=0;$i<strlen($sWords);$i++)
    {
        $sNewWords.=$sWords[$i]."/";
    }
    $sMorse=strtr($sNewWords,$ord_der_skal_erstattes);
   
    $sMorse=str_replace(' ','',$sMorse);
    return $sMorse;
}

$hmd_morse=WordtoMorse("hej med dig");
echo $hmd_morse;
echo MorsetoWord($hmd_morse);
?>
Avatar billede erikjacobsen Ekspert
05. august 2007 - 09:44 #8
Man kan jo også vende et associativt array med http://php.net/array_flip
Avatar billede olebole Juniormester
05. august 2007 - 13:08 #9
<ole>

Du kan også bare:

<?

$fra = "/...././.---//--/./..-//..-/../--./";

$ord_der_skal_erstattes = array(
    "/..-/",
    "/./",
    "/--./",
    "/..../",
    "/../",
    "/.---/",
    "/--/",
    "//"
);
$erstat_ord_med = array(
    "/d/",
    "/e/",
    "/g/",
    "/h/",
    "/í/",
    "/j/",
    "/m/",
    "/ /"
);

$fra = str_replace($ord_der_skal_erstattes, $erstat_ord_med, $fra);
$fra = str_replace("/", "", $fra);

print $fra;

?>

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
05. august 2007 - 13:30 #10
Et "." i morse er ".-.-.-" og er vi nu sikker på at alle løsninger kan klare lige det ??
Avatar billede michaeltryl Seniormester
05. august 2007 - 13:32 #11
Tak for de mange svar. Jeg bruger den sidste, som olebole skrev. Så hvis du vil komme med et svar får du nogen point.
Avatar billede michaeltryl Seniormester
05. august 2007 - 13:45 #12
Jeg havde ikke testet med punktum og det kan jeg ikke få til at virke med olebole's løsning, men det virker fint med den som erikjacobsen kom med den 05/08-2007 08:16:00, så jeg bruger den istedet
Avatar billede olebole Juniormester
05. august 2007 - 13:59 #13
Hvor skal det punktum stå, for at få den til at fejle. Her har jeg smidt tre stykker ind - og der får jeg da udskrevet alle tre:

<?

$fra = "/.-.-.-//...././.---/.-.-.-//--/./..-//..-/../--./.-.-.-/";

$ord_der_skal_erstattes = array(
    "/..-/",
    "/./",
    "/--./",
    "/..../",
    "/../",
    "/.---/",
    "/--/",
    "//",
    "/.-.-.-/"
);
$erstat_ord_med = array(
    "/d/",
    "/e/",
    "/g/",
    "/h/",
    "/í/",
    "/j/",
    "/m/",
    "/ /",
    "/./"
);

$fra = str_replace($ord_der_skal_erstattes, $erstat_ord_med, $fra);
$fra = str_replace("/", "", $fra);

print $fra;

?>
Avatar billede erikjacobsen Ekspert
05. august 2007 - 13:59 #14
Du får ingen svar fra mig - samler ikke på point.

Men hvad skal du bruge det til?
Avatar billede erikjacobsen Ekspert
05. august 2007 - 14:01 #15
Det kommer nemlig an på, Ole. Den her fejler:

$fra = "/.-.-.-//...././.---/.-.-.-//--/./..-//..-/../--./.-.-.-/";

$ord_der_skal_erstattes = array(
    "/..-/",
      "/.-.-.-/",
    "/./",
    "/--./",
    "/..../",
    "/../",
    "/.---/",
    "/--/",
    "//"
);
$erstat_ord_med = array(
    "/d/",
      "/./",
    "/e/",
    "/g/",
    "/h/",
    "/í/",
    "/j/",
    "/m/",
    "/ /"

);

$fra = str_replace($ord_der_skal_erstattes, $erstat_ord_med, $fra);
$fra = str_replace("/", "", $fra);

print $fra;
Avatar billede olebole Juniormester
05. august 2007 - 14:06 #16
Jamen, så skal du da bare lade være med at skrive dét  ;D
Avatar billede michaeltryl Seniormester
05. august 2007 - 14:23 #17
Jeg skal bruge det, mest lokalt, til at lave en masse tekst om til morse koder, som andre skal tyde.
Avatar billede erikjacobsen Ekspert
05. august 2007 - 14:27 #18
Ja, ok. Skal man lære at høre morse, hjælper det ikke noget at sidde og kigge på prikker og streger. Det man skal i det tilfælde er at få lyden "didahdahdah" til at associeres med bogstavet "j" - men skal ikke tælle prikker og streger. Men det er en helt anden sag.
Avatar billede olebole Juniormester
05. august 2007 - 14:38 #19
- ligesom man ikke lærer at læse ved at sidde og terpe stavning bogstav for bogstav. Den metode skal man vist være politiker for at tro på  ;o)
Avatar billede michaeltryl Seniormester
20. september 2007 - 17:32 #20
jeg brugte olebole's løsning, så vil du smide et svar så lukker jeg her
Avatar billede olebole Juniormester
21. september 2007 - 02:35 #21
Så kan du også prøve at lege lidt med denne her:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>VæpMorseFætter 1.0</title>
<style type="text/css">
html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}
.m_display {
    padding: 10px;
}
.m_display * {
    vertical-align: middle;
}
.m_display s {
    /* Morse dash */
    font-size: 0;
    padding: 0 6px;
    margin: 0 2px 0 1px;
    background: black;
}
.m_display i {
    /* Morse dot */
    font-size: 0;
    padding: 0 2px;
    margin: 0 2px 0 1px;
    background: black;
}
.m_display span {
    /* Letter */
    margin: 0 5px;
    white-space: nowrap;
}
.m_display span.break {
    /* Word break */
    margin: 0 12px;
}
</style>
<script type="text/JavaScript">
var d=document;
function gE(id){return d.getElementById(id)};
function cE(t){return d.createElement(t)};
function cT(s){return d.createTextNode(s)};

//  Duration af a dash in seconds
var nDashDur = 0.5;

//  Morse code delimiter character
var sDelimiter = "/";

var oTmpl = {};
oTmpl.char = cE("span");
oTmpl.wBreak = cE("span");
oTmpl.dash = cE("s");
oTmpl.dash.appendChild( cT("\u00a0") );
oTmpl.dot = cE("i");
oTmpl.dot.appendChild( cT("\u00a0") );
oTmpl.wBreak.appendChild( cT("\u00a0") );
oTmpl.wBreak.className = "break";

var oDispl = null;
var oActLetter = null;
var oMorseTimer = null;
var aMorseLetters = [];
nDashDur *= 1000;
var nDotDur = nDashDur/3;
var nBreakDur = nDashDur*3;
var bMorseEnabled = true;

function kDown(e) {
    e = e ? e : event;
    if (!bMorseEnabled) return;
    if (!(e.keyCode==13 && e.altKey)) return;
    bMorseEnabled = false;
    var nNow = new Date().getTime();
    if (!oMorseTimer) oDispl.removeChild(oDispl.firstChild);
    if (oMorseTimer&&nNow-oMorseTimer>nBreakDur) {
        oDispl.appendChild( cT(" ") );
        oActLetter = oTmpl.wBreak.cloneNode(true);
        oDispl.appendChild(oActLetter);
        aMorseLetters.push(" ");
    }
    if (nNow-oMorseTimer>nDashDur) {
        oActLetter = oTmpl.char.cloneNode(true);
        oDispl.appendChild(oActLetter);
        oDispl.appendChild( cT(" ") );
        aMorseLetters.push("");
    }
    oMorseTimer = nNow;
    killEvent(e);
}
function kUp(e) {
    e = e ? e : event;
    if (!(e.keyCode==13 && e.altKey)) return;
    var nDelay, o, nNow = new Date().getTime();
    nDelay = nNow-oMorseTimer;
    o = oTmpl[ nDelay<=nDotDur ? "dot" : "dash" ].cloneNode(true);
    aMorseLetters[aMorseLetters.length-1] += nDelay<=nDotDur ? "." : "-";
    oActLetter.appendChild(o);
    oMorseTimer = nNow;
    bMorseEnabled = true;
    killEvent(e);
}
function killEvent(e) {
    if (e.preventDefault) e.preventDefault();
    if (e.stopPropagation) e.stopPropagation();
    e.cancelBubble = true;
    e.returnValue = false;
}

function getMorseString() {
    return aMorseLetters.join(sDelimiter);
}
function clearMorseDisplay() {
    while (oDispl.firstChild) oDispl.removeChild(oDispl.firstChild);
    oDispl.appendChild( cT("\u00a0") );
    oMorseTimer = null;
    aMorseLetters = [];
}

window.onload = function() {
    oDispl = document.getElementById("morseDisplay");
    document.onkeydown = kDown;
    document.onkeyup = kUp;
}
</script>
</head>
<body>
<p><button onclick="alert(getMorseString())" onfocus="this.blur()">Kode</button>
    <button onclick="clearMorseDisplay()" onfocus="this.blur()">Slet</button></p>
<p>Hold ALT nede og skriv morsekode med 'Return'. En streg er i øjeblikket sat til 1/2 sekund.</p>
<div style="padding:20px">

<div id="morseDisplay" class="m_display">&nbsp;</div>

<hr>
<div class="m_display">
    <span><s>&nbsp;</s><s>&nbsp;</s><s>&nbsp;</s></span>
    <span><i>&nbsp;</i><s>&nbsp;</s><i>&nbsp;</i><i>&nbsp;</i></span>
    <span><i>&nbsp;</i></span>
    <span class="break">&nbsp;</span>
    <span><s>&nbsp;</s><i>&nbsp;</i><i>&nbsp;</i><i>&nbsp;</i></span>
    <span><s>&nbsp;</s><s>&nbsp;</s><s>&nbsp;</s></span>
    <span><i>&nbsp;</i><s>&nbsp;</s><i>&nbsp;</i><i>&nbsp;</i></span>
    <span><i>&nbsp;</i></span>
    <span class="break">&nbsp;</span>
    <b>;o)</b>
</div>
</div>

</body>
</html>
Avatar billede olebole Juniormester
21. september 2007 - 18:10 #22
Tak for points  ;o)
Avatar billede jakobdo Ekspert
22. september 2007 - 10:09 #23
OleBole, måske er det bare mig, men jeg kan altså ikke få din kode til at virke i hverken Firefox eller IE7 :o(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester