diff --git a/admin/multilangupgrade.php b/admin/multilangupgrade.php
index 738509cd28964..bd0eca9379737 100644
--- a/admin/multilangupgrade.php
+++ b/admin/multilangupgrade.php
@@ -63,12 +63,8 @@
if ($rs and $rs->RecordCount() > 0) {
while (!$rs->EOF) {
$text = $rs->fields[$column];
- $search = '/(<(?:lang|span) lang="[a-zA-Z0-9_-]*".*?>.+?<\/(?:lang|span)>)(\s*<(?:lang|span) lang="[a-zA-Z0-9_-]*".*?>.+?<\/(?:lang|span)>)+/is';
- $newtext = preg_replace_callback($search, 'multilangupgrade_impl', $text);
- if ($newtext != $text) {
- $newtext = addslashes($newtext);
- execute_sql("UPDATE $table SET $column='$newtext' WHERE id=".$rs->fields['id'], false);
- }
+ $id = $rs->fields['id'];
+
if ($i % 600 == 0) {
echo '
';
}
@@ -77,6 +73,22 @@
}
$i++;
$rs->MoveNext();
+
+ if (empty($text) or is_numeric($text)) {
+ continue; // nothing to do
+ }
+
+ $search = '/(<(?:lang|span) lang="[a-zA-Z0-9_-]*".*?>.+?<\/(?:lang|span)>)(\s*<(?:lang|span) lang="[a-zA-Z0-9_-]*".*?>.+?<\/(?:lang|span)>)+/is';
+ $newtext = preg_replace_callback($search, 'multilangupgrade_impl', $text);
+
+ if (is_null($newtext)) {
+ continue; // regex error
+ }
+
+ if ($newtext != $text) {
+ $newtext = addslashes($newtext);
+ execute_sql("UPDATE $table SET $column='$newtext' WHERE id=$id", false);
+ }
}
}
}
diff --git a/filter/multilang/filter.php b/filter/multilang/filter.php
index aae004295672d..7da88d6a500ec 100644
--- a/filter/multilang/filter.php
+++ b/filter/multilang/filter.php
@@ -44,6 +44,10 @@ function multilang_filter($courseid, $text) {
// [nicolasconnault] Should support inverted attributes: (Doesn't work curently)
// [skodak] it supports it now, though it is slower - any better idea?
+ if (empty($text) or is_numeric($text)) {
+ return $text;
+ }
+
if (empty($CFG->filter_multilang_force_old) and !empty($CFG->filter_multilang_converted)) {
// new syntax
$search = '/(.*?<\/span>)(\s*.*?<\/span>)+/is';
@@ -51,7 +55,14 @@ function multilang_filter($courseid, $text) {
// old syntax
$search = '/(<(?:lang|span) lang="[a-zA-Z0-9_-]*".*?>.*?<\/(?:lang|span)>)(\s*<(?:lang|span) lang="[a-zA-Z0-9_-]*".*?>.*?<\/(?:lang|span)>)+/is';
}
- return preg_replace_callback($search, 'multilang_filter_impl', $text);
+
+ $result = preg_replace_callback($search, 'multilang_filter_impl', $text);
+
+ if (is_null($result)) {
+ return $text; //error during regex processing (too many nested spans?)
+ } else {
+ return $result;
+ }
}
function multilang_filter_impl($langblock) {