我正在开发一个自定义拼写检查器(边做边学),它需要在提交表单时执行以下操作:
- 将从textarea提交的字符串转换为单词数组。
- 在mysql
english
表中查找数组中的每个单词。 - 如果单词不存在,将其标记为拼写错误,并将其包装在HTML标签中。
- 将数组转换回包含原始标点符号、换行符和新标记的单词的字符串。
我已经搜索了许多帖子以及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> ";
}
}
<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>