PHP-如何避免替换替换字符串

时间:2019-05-11 17:45:15

标签: php string replace

我正在编写一个脚本,该脚本允许学生将答案输入到表单中并向他们提供即时反馈。

我从一个字符串($ 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

有什么方法可以避免替换替换品吗?

我希望我不要漫步太多...由于这个问题,我已经为之奋斗了很久了,并希望得到任何建议。

2 个答案:

答案 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);

这是一种易于修复的解决方案,可以解决您当前的代码状态。可以对其进行重构(在解析正确的单词时进行模式替换,可以使用产生所需字符串的方法来替换绿色/框数组等)