Drupal 6 preg_replace Compilation failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff)

Seit dem Update von PCRE auf Version 8.30 (Drupal 6.24 und 6.25, FreeBSD 9, PHP 5.3.10) wird die folgende Warnung bei der Verwendung der Suchfunktion angezeigt.

[Update]
Mit Drupal 6.26 (genauer: PHP 5.3.13, PCRE 8.30_2) ist dieses Problem behoben.

  1. &#13;
  2. warning: preg_replace() [function.preg-replace]: Compilation failed: disallowed Unicode code point (&gt;= 0xd800 &amp;&amp; &#13;
  3. <p>Das ist in sofern ärgerlich, weil dieses Modul auch von <a href="https://drupal.org/project/search404">search404</a> verwendet wird.</p>&#13;
  4. <p>Auf der Drupalseite werden nur aktuellere Versionen diskutiert, ein Fix, der unter<br /><a href="http://drupal.org/node/1442876">Getting errors during install about preg_match() disallowed Unicode code point</a><br />&#13;
  5. diskutiert wird, führt aber auch zur Lösung im genannten Problem. In der Datei</p>&#13;
  6. <code>&#13;
  7. modules/search/search.module&#13;

direkt am Anfang des Scripts wird PREG_CLASS_SEARCH_EXCLUDE definiert, hier die letzten drei Zeilen

<?php&#13;
'\x{a806}\x{a80b}\x{a823}-\x{a82b}\x{d800}-\x{f8ff}\x{fb1e}\x{fb29}\x{fd3e}'.&#13;
'\x{fd3f}\x{fdfc}-\x{fe6b}\x{feff}-\x{ff0f}\x{ff1a}-\x{ff20}\x{ff3b}-\x{ff40}'.&#13;
'\x{ff5b}-\x{ff65}\x{ff70}\x{ff9e}\x{ff9f}\x{ffe0}-\x{fffd}');&#13;
?>

gegen

<?php&#13;
'\x{a80b}\x{a823}-\x{a82b}\x{f8ff}\x{fb1e}\x{fb29}\x{fd3e}\x{fd3f}\x{fdfc}-' .&#13;
'\x{fe6b}\x{feff}-\x{ff0f}\x{ff1a}-\x{ff20}\x{ff3b}-\x{ff40}\x{ff5b}-\x{ff65}' .&#13;
'\x{ff70}\x{ff9e}\x{ff9f}\x{ffe0}-\x{fffd}');&#13;
?>

ersetzen - oder angehängten Patch

  1. &#13;
  2. --- modules/search/search.module.orig 2012-02-23 12:05:16.812776466 +0100&#13;
  3. +++ modules/search/search.module 2012-02-23 11:42:14.273778375 +0100&#13;
  4. @@ -43,9 +43,9 @@&#13;
  5. '\x{2ce5}-\x{2cff}\x{2d6f}\x{2e00}-\x{3005}\x{3007}-\x{303b}\x{303d}-\x{303f}'.&#13;
  6. '\x{3099}-\x{309e}\x{30a0}\x{30fb}\x{30fd}\x{30fe}\x{3190}-\x{319f}\x{31c0}-'.&#13;
  7. '\x{31cf}\x{3200}-\x{33ff}\x{4dc0}-\x{4dff}\x{a015}\x{a490}-\x{a716}\x{a802}'.&#13;
  8. -'\x{a806}\x{a80b}\x{a823}-\x{a82b}\x{d800}-\x{f8ff}\x{fb1e}\x{fb29}\x{fd3e}'.&#13;
  9. -'\x{fd3f}\x{fdfc}-\x{fe6b}\x{feff}-\x{ff0f}\x{ff1a}-\x{ff20}\x{ff3b}-\x{ff40}'.&#13;
  10. -'\x{ff5b}-\x{ff65}\x{ff70}\x{ff9e}\x{ff9f}\x{ffe0}-\x{fffd}');&#13;
  11. +'\x{a80b}\x{a823}-\x{a82b}\x{f8ff}\x{fb1e}\x{fb29}\x{fd3e}\x{fd3f}\x{fdfc}-' .&#13;
  12. +'\x{fe6b}\x{feff}-\x{ff0f}\x{ff1a}-\x{ff20}\x{ff3b}-\x{ff40}\x{ff5b}-\x{ff65}' .&#13;
  13. +'\x{ff70}\x{ff9e}\x{ff9f}\x{ffe0}-\x{fffd}');&#13;
  14. &#13;
  15. /**&#13;
  16. * Matches all 'N' Unicode character classes (numbers)&#13;

im Drupalverzeichnis mit

  1. &#13;
  2. patch -pl &#13;
  3. <p>anwenden.</p>&#13;
  4. <h2>Drupal Projekt Chaos tool suite (ctools) 6.x-1.8</h2>&#13;
  5. <p>Im Modulverzeichnis in der Datei</p>&#13;
  6. <code>&#13;
  7. ctools/includes/cleanstring.inc&#13;

wird ebenfalls diese Definition verwendet und muss vielleicht auch bei einem Fehler angepasst werden.

Kommentare

Hallo Stefan,
danke für diese Tipps, bekomme nach Update von ctools, date, token, media und colorbox immer diese Fehlermeldung:

•Warning: preg_match(): Compilation failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 2112 in truncate_utf8() (Zeile 339 von /usr/share/drupal7/includes/unicode.inc).
•Warning: preg_match(): Compilation failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 2112 in truncate_utf8() (Zeile 339 von /usr/share/drupal7/includes/unicode.inc).
•Warning: preg_match(): Compilation failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 2112 in truncate_utf8() (Zeile 339 von /usr/share/drupal7/includes/unicode.inc).

Ich bin auf 7.12 unterwegs. Vielleicht liegt es ja an ctools.- Kannst du auch kurz erklären, was bei ctools - möglichst ohnePatch zu machen ist?

dank dir.-

frank

Hallo Frank,

wie die Fehlermeldung aussagt, das liegt an der Datei

  1. &#13;
  2. includes/unicode.inc&#13;

oder genauer bei Dir

  1. &#13;
  2. /usr/share/drupal7/includes/unicode.inc&#13;

Ohne Patch ist da nichts zu machen. Bei Drupal 7.12 hat mir der Patch do-1446372-remove-surrogates.patch weiter geholfen:

https://www.drupal.org/files/do-1446372-remove-surrogates.patch

Den Patch kannst Du natürlich auch manuell durchführen. Dazu die Datei includes/unicode.inc in einem Editor öffnen; weit oben in der Datei wird die Konstante

<?php&#13;
define('PREG_CLASS_UNICODE_WORD_BOUNDARY',&#13;
?>

definiert.
Innerhalb dieser Definition die drittletzte Zeile (Zeile 76 in der Datei) suchen

<?php&#13;
  '\x{D800}-\x{F8FF}\x{FB29}\x{FD3E}-\x{FD3F}\x{FDFC}-\x{FDFD}' .&#13;
?>

und zu Beginn D800 gegen E000 (hexadezimal, 0 = Ziffer Null) ersetzen.

In der Zeile 339, in der der Fehler auftritt wird diese Konstante verwendet.

Viel Erfolg!
Stefan

Hallo Stefan,
danke nochmal für die Hilfestellung.- Mein Provider hat mittlerweile die Zeilen geändert und jetzt gibts keine Fehlermeldung mehr.- Das Problem hat auch nix mit Ctools oder sonst einem Nicht Drupal-Kernmodul zu tun, da der Fehler auch bei einer Neuinstallation aufgetaucht ist.-

vg, frank

Das ist richtig, es liegt an dem Update auf die Version 8.30 von PCRE, die Perl kompatiblen regulären Ausdrücke (Perl Compatible Regular Expressions).

Die ctools sind auch betroffen, der Fehler wirkt sich nur deswegen nicht aus, weil das betreffende Script nicht ausgeführt wird. Die Konstante CTOOLS_PREG_CLASS_ALNUM  in der Datei tools/includes/cleanstring.inc ist eine Kopie von PREG_CLASS_SEARCH_EXCLUDE, die den Fehler verursacht hat. Diese Konstante wird in der Funktion ctools_cleanstring() in einem regulären Ausdruck benutzt und kann dort die Fehlermeldung produzieren.

Vielen Dank, das hat geholfen :)