PHP:字符串到数组,检查拼写,返回字符串(保留特殊字符)


PHP: String to array, check spelling, back to string (preserving special characters)

我正在开发一个自定义拼写检查器(边做边学),它需要在提交表单时执行以下操作:

  1. 将从textarea提交的字符串转换为单词数组。
  2. 在mysql english表中查找数组中的每个单词。
  3. 如果单词不存在,将其标记为拼写错误,并将其包装在HTML标签中。
  4. 将数组转换回包含原始标点符号、换行符和新标记的单词的字符串。

我已经搜索了许多帖子以及php.net,我已经提出了以下代码,除了#4,我已经被困在那里几天了(我想我需要在#1中或之前添加一些东西来保存部分,但我似乎无法将我的头围绕它):

当前代码:

$inputContents = $_POST['compose'];
$inputContents = preg_replace("/[^a-zA-Z ']+/", ' ', $inputContents);
$inputContents = trim($inputContents);
$inputContents = preg_split("/'s+/", $inputContents);
var_dump($inputContents);
foreach ($inputContents as $singleWord) {
  $word_exists = mysql_query("SELECT `word` FROM `english` WHERE `word` = '". mysql_real_escape_string($singleWord) ."'") or die(mysql_error());
  $word_exists = mysql_num_rows($word_exists);
  if ($word_exists !== 0) {
    echo $singleWord ." ";
  }else{
    echo "<span id='misspelledWord' style='font-style:italic;'>". $singleWord ."</span>&nbsp;";
  }
}
<form action="spellcheck_test.php" method="POST">
  <textarea name="compose"></textarea>
  <input type="submit" value="Post!" />
</form>
使用上面的代码,如果我的字符串是:

Spellling games; they're alot of fun!

那么我的数组变成:

array(6) { [0]=> string(9) "Spellling" [1]=> string(5) "games" [2]=> string(7) "they're" [3]=> string(4) "alot" [4]=> string(2) "of" [5]=> string(3) "fun" }

,代码输出:

拼写游戏他们很多的乐趣

但是我希望它输出:

法术游戏;他们很有趣!

关于完成#4有什么建议吗?

你应该使用explode(' ',$inputContents),你将结束与:

{ [0]=> "Spellling" [1]=> "games;" [2]=> "they're" [3]=> "alot" [4]=> "of" [5]=> "fun!" }

然后创建一个新的数组$checkedWords=array();并处理2。

foreach ($inputContents as $singleWord) {
  //your MySQL checks here;
  //mysql_ functions were deprecated, use mysqli or PDO instead
  preg_match('/([a-zA-Z'']*)('W*)/',$singleWord,$parts);
  //check parts[0] against MySQL here
  //$parts[1] is your word without other following chars
  //$parts[2] are any characters following your word
  if (isset($parts[2]) $parts[2]=''; 
  if ($word_exists !== 0) {
     $checkedWords[]=$parts[1].$parts[2];
  }else{
     $checkedWords[]="<span class='misspelledWord'>".$parts[1]."</span>".$parts[2];
  }
}

得到4。你只需要输入implode(' ',$checkedWords)

这是我最终得到的代码。在测试过程中做了一些细微的改变来修复问题。

if (isset($_POST['compose'])) {
  $inputContents = $_POST['compose'];
  $paragraph =     preg_split("/'n+/m", $inputContents);
  foreach ($paragraph as $singleWords) {
    $singleWords =   preg_split("/'s+/m", $singleWords);
    $combineWords =  array();
    foreach ($singleWords as $singleWord) {
      preg_match('/(["]*)([a-zA-Z''-]*)(['W0-9]*)/',$singleWord,$parts);
      $word_exists =  mysql_query("SELECT `word` FROM `english` WHERE `word` = '". mysql_real_escape_string($parts[2]) ."'") or die(mysql_error());
      $word_exists =  mysql_num_rows($word_exists);
      $checkedWords = array();
      if ($word_exists !== 0) {
        $checkedWords[$singleWord] = $parts[1].$parts[2].$parts[3];
      }else{
        $checkedWords[$singleWord] = $parts[1]."<span class='misspelledWord'>".$parts[2]."</span>".$parts[3];
      }
    $combineWords[] = implode(' ',$checkedWords);
    }
    $reformParagraph[] = implode(' ',$combineWords);
  }
  $reformContents = implode("<br />",$reformParagraph);
  echo "<p>".$reformContents."</p>";
}

和形式…

<form action="spellcheck_test.php" method="POST">
  <textarea name="compose"></textarea>
  <input type="submit" name="submitPart" value="Post!" />
</form>