我正在编写一个脚本,该脚本允许学生将答案输入到表单中并向他们提供即时反馈。
我从一个字符串($ content)开始,该字符串包含带有方括号中的空格的完整任务,如下所示:
There's [somebody] in the room. There isn't [anybody] in the room.
Is [anybody] in the room?
现在,脚本可以识别解决方案(某人,任何人,任何人)并将其保存在数组中。学生的答案也在数组中。
要查看答案是否正确,脚本将检查$ input [$ i]和$ solution [$ i]是否相同。
现在是问题所在:我想让脚本用一个输入框替换占位符,在该输入框上解决方案是错误的,而解决方案在绿色处是正确的。 $ content的更新版本将显示在下一页。 但是,如果有两个相同解决方案,则将导致多次替换,因为替换将再次被替换...
我尝试将preg_replace限制为1,但这并不能解决问题,因为它不会跳过已经被替换的解决方案。
$i=0; while ($solution[$i]){ //answer correct if($solution[$i] == $input[$i]){ //replace placeholder > green solution $content = str_replace($solution[$i], $solution_green[$i], $content); } //answer wrong else{ //replace placeholder > input box to try again $content = str_replace($solution[$i], $solution_box[$i], $content); } $i++; } print $content; //Output new form based on student's answer
有什么方法可以避免替换替换品吗?
我希望我不要漫步太多...由于这个问题,我已经为之奋斗了很久了,并希望得到任何建议。
答案 0 :(得分:0)
我处理此问题的方法是将原始内容分成与文本中的标记相关的段。因此,您explode()
的{{1}}原始文本,最终得到...
]
如您所见,每个数组元素现在都与答案/解决方案编号相对应。因此,替换文本时,它会更改Array
(
[0] => There's [somebody
[1] => in the room. There isn't [anybody
[2] => in the room.
Is [anybody
[3] => in the room?
)
。另外,作为一种保障措施,它取代了$parts[$i]
以确保还有其他解决方案,但这应该可以完成工作。
最后,代码使用[text
并使用implode()
将其重新添加来重建原始内容。
]
答案 1 :(得分:0)
您可以使用sprintf()
/ vsrpintf()
函数替换位置占位符,但是首先您必须为其准备句子模式。每个“解决方案占位符”都应替换为%s
,以便以后的sprintf()
可以将每个替换为相应的字符串。
您可以在循环中执行此操作:
$fields = [];
while (isset($solution[$i])) {
$fields[] = ($solution[$i] === $input[$i])
? $solution_green[$i]
: $solution_box[$i];
//doesn't matter if you replace more than one here
$content = str_replace($solution[$i], '%s', $content);
$i++;
}
print vsprintf($content, $fields);
//or for php>=5.6: sprintf($content, ...$fields);
这是一种易于修复的解决方案,可以解决您当前的代码状态。可以对其进行重构(在解析正确的单词时进行模式替换,可以使用产生所需字符串的方法来替换绿色/框数组等)