str_replace仅匹配

时间:2013-07-25 17:57:48

标签: php string str-replace

美好的一天,

我正在尝试创建一个莫尔斯代码,以便将文本和文本转换为莫尔斯代码转换器。

我的代码:

$letter = str_split(strtolower($_POST['text']));
$morse = $_POST['morse'];
$morsecmp = explode(" ",$morse);
$letter = implode(" ",$letter);
$mode = $_POST['sub'];

$morsecode = array(".-","-...","-.-.","-..","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",
            ".--.","--.-",".-.","...","-.","..-","...-",".--","-..-","-.--","--..",".");
$letters = array("a","b","c","d","f","g","h","i","j","k","l","m","n","o","p","q","r",
            "s","t","u","v","w","x","y","z","e");

if($mode == "Text to Morse Code"){  
    $letter = str_replace($letters,$morsecode,$letter);
    $translated = $letter;
}else{
    for($x=0;$x<sizeof($letters);$x++){
        for($y=0;$y<sizeof($morsecmp);$y++){

            if($morsecode[$x] === $morsecmp[$y]){
                echo $morsecode[$x]." === ".$letters[$x]."<br>";
                $morse = str_replace($morsecode[$x],$letters[$x],$morse);
            }
        }
    }
    $translated = $morse;
}

示例输入:

  

.... .- .. ..- .. --- .-- --- .-。 .- .. - ..

示例输出:

  

编辑了

预期产出:

  

你好wolrd

我的问题是,当从莫尔斯代码转换为文本时,由于str_replace限制,某些字符无法正确捕获,因为它将替换所有类似于针的字符串,所以如果我必须替换所有&#34;。& #34;它也将改变&#34; ....&#34;这应该是一个h。

对此的任何帮助将不胜感激。

谢谢。

3 个答案:

答案 0 :(得分:1)

当你重新定位字符时,为search字符串添加额外的空格。

 $morse = $_POST['morse']." ";  // this is to add an extra space at the end of the morse string.

现在我们用所需的字母替换所有出现的莫尔斯代码字符串,后跟空格。

 $morse = str_replace($morsecode[$x]." ",$letters[$x],$morse);

答案 1 :(得分:0)

首先,您没有在阵列中存储完整的字母。我注意到你错过了'e'。

将莫尔斯代码吹成带explode(' ', $morse_code)的数组,然后对数组进行替换(使用'/'分隔单词)。

将其缩回到implode()的字符串。

下面是一个供您使用的数组,它有整个字母表(您可以使用array_flip来切换来回翻译的键和值)

$translator_table = array(
'A' => '.-',
'B' => '-...',
'C' => '-.-.',
'D' => '-..',
'E' => '.',
'F' => '..-.',
'G' => '--.',
'H' => '....',
'I' => '..',
'J' => '.---',
'K' => '-.-',
'L' => '.-..',
'M' => '--',
'N' => '-.',
'O' => '---',
'P' => '.--.',
'Q' => '--.-',
'R' => '.-.',
'S' => '...',
'T' => '-',
'U' => '..-',
'V' => '...-',
'W' => '.--',
'X' => '-..-',
'Y' => '-.--',
'Z' => '--.',
'0' => '-----',
'1' => '.----',
'2' => '..---',
'3' => '...--',
'4' => '....-',
'5' => '.....',
'6' => '-....',
'7' => '--...',
'8' => '---..',
'9' => '----.',
'.' => '.-.-.-',
',' => '--..--',
'?' => '..--.',
);

答案 2 :(得分:0)

替换完全匹配项的唯一方法是:

   $morse = preg_replace("#{$morsecode[$x]}#", $letters[$x], $morse, 1); //Limit to 1