Navigation Menu

Skip to content

Commit

Permalink
(MDL-10155) detect failed regexes duing multilang upgrade (it was cau…
Browse files Browse the repository at this point in the history
…sing data loss on some sites); backported from HEAD
  • Loading branch information
skodak committed Jun 19, 2007
1 parent e1e7d03 commit c92d8dd
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 7 deletions.
24 changes: 18 additions & 6 deletions admin/multilangupgrade.php
Expand Up @@ -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 '<br />';
}
Expand All @@ -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);
}
}
}
}
Expand Down
13 changes: 12 additions & 1 deletion filter/multilang/filter.php
Expand Up @@ -44,14 +44,25 @@ function multilang_filter($courseid, $text) {
// [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';
} else {
// 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) {
Expand Down

0 comments on commit c92d8dd

Please sign in to comment.