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) {