MDL-36571 qtype multichoice: don't corrupt unicode characters.

It seems that \s includes non-breaking space, and the typical one-byte
representation of that is the same as some parts of multibyte unicode
characters. Therefore, you need to include the u modifer on the regular
expressions.

Also, remove any number of <br /> at the end of the answer.

Thanks to Joseph Rézeau and Jean-Michel Vedrine for working out what the
problem was, and how to fix it.
This commit is contained in:
Tim Hunt
2012-11-19 18:20:38 +00:00
parent 6548ce0915
commit 4c1a35e34c
2 changed files with 6 additions and 4 deletions
+4 -4
View File
@@ -126,10 +126,10 @@ abstract class qtype_multichoice_base extends question_graded_automatically {
}
public function make_html_inline($html) {
$html = preg_replace('~\s*<p>\s*~', '', $html);
$html = preg_replace('~\s*</p>\s*~', '<br />', $html);
$html = preg_replace('~<br />$~', '', $html);
return $html;
$html = preg_replace('~\s*<p>\s*~u', '', $html);
$html = preg_replace('~\s*</p>\s*~u', '<br />', $html);
$html = preg_replace('~(<br\s*/?>)+$~u', '', $html);
return trim($html);
}
}
@@ -147,6 +147,8 @@ class qtype_multichoice_single_question_test extends advanced_testcase {
$this->assertEquals("Frog<br />XXX <img src='http://example.com/pic.png' alt='Graph' />",
$mc->make_html_inline(" <p> Frog </p> \n\r
<p> XXX <img src='http://example.com/pic.png' alt='Graph' /> </p> "));
$this->assertEquals('Frog', $mc->make_html_inline('<p>Frog</p><p></p>'));
$this->assertEquals('Frog<br />†', $mc->make_html_inline('<p>Frog</p><p>†</p>'));
}
}