2013-07-25 137 views
0

好日子,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; 
} 

样本输入:

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

输出样本:

他ED超低owor版d

预期输出:

你好世界国际

我的问题是w母鸡从莫尔斯电码转换为文本某些字符由于str_replace限制不能正确捕获,因为它将替换所有类似于针的字符串,所以如果我必须全部替换“。”。到e它也会改变“......”,这实际上应该是一个h。

任何帮助,将不胜感激。

谢谢。

回答

1

只是当你repalce字符添加一个额外的空间为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); 
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' => '----.', 
'.' => '.-.-.-', 
',' => '--..--', 
'?' => '..--.', 
);