2

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

  1. 将从 textarea 提交的字符串转换为单词数组。
  2. english在 mysql表中搜索数组中的每个单词。
  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 有什么建议吗?

4

2 回答 2

0

对于 1. 你应该使用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)

于 2013-01-05T22:59:52.570 回答
0

这是我最终得到的最终代码。在测试期间进行了一些细微的更改以解决问题。

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>
于 2013-01-07T03:55:34.757 回答