### Eclipse Workspace Patch 1.0
#P moodle
Index: admin/multilangupgrade.php
===================================================================
RCS file: /cvsroot/moodle/moodle/admin/multilangupgrade.php,v
retrieving revision 1.4
diff -u -r1.4 multilangupgrade.php
--- admin/multilangupgrade.php	15 Jun 2007 06:08:51 -0000	1.4
+++ admin/multilangupgrade.php	18 Jun 2007 21:54:01 -0000
@@ -59,12 +59,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 '<br />';
                         }
@@ -73,6 +69,28 @@
                         }
                         $i++;
                         $rs->MoveNext();
+
+                        if (empty($text) or is_numeric($text)) {
+                            continue; // nothing to do
+                        }
+
+                        // do not use (?:lang|span) - it was failing for complex texts! - MDL-10155
+                        $search = '/(<span lang="[a-zA-Z0-9_-]*".*?>.+?<\/span>)(\s*<span lang="[a-zA-Z0-9_-]*".*?>.+?<\/span>)+/is';
+                        $newtext = preg_replace_callback($search, 'multilangupgrade_impl', $text);
+                        if (is_null($newtext)) {
+                            continue; // regex error
+                        }
+
+                        $search = '/(<lang lang="[a-zA-Z0-9_-]*".*?>.+?<\/lang>)(\s*<lang lang="[a-zA-Z0-9_-]*".*?>.+?<\/lang>)+/is';
+                        $newtext = preg_replace_callback($search, 'multilangupgrade_impl', $newtext);
+                        if (is_null($newtext)) {
+                            continue; // regex error
+                        }
+
+                        if ($newtext != $text) {
+                            $newtext = addslashes($newtext);
+                            execute_sql("UPDATE $table SET $column='$newtext' WHERE id=$id", false);
+                        }
                     }
                 }
             }
Index: filter/multilang/filter.php
===================================================================
RCS file: /cvsroot/moodle/moodle/filter/multilang/filter.php,v
retrieving revision 1.19
diff -u -r1.19 filter.php
--- filter/multilang/filter.php	20 Mar 2007 17:14:18 -0000	1.19
+++ filter/multilang/filter.php	18 Jun 2007 21:54:01 -0000
@@ -44,6 +44,10 @@
     // [nicolasconnault] Should support inverted attributes: <span class="multilang" lang="en"> (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+lang="[a-zA-Z0-9_-]+"|\s+class="multilang"){2}\s*>.*?<\/span>)(\s*<span(\s+lang="[a-zA-Z0-9_-]+"|\s+class="multilang"){2}\s*>.*?<\/span>)+/is';
@@ -51,7 +55,14 @@
         // 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) {
