Ich habe Strings, die aus einer PHP-Datei gelesen werden, zum Beispiel:PHP - RegEx Problem
<?php
// Dream Portal (c) 2009-2010 Dream Portal Team
// DreamPortal.english.php; @1.1
global $scripturl, $context;
// General Strings
$txt['forum'] = 'Forum';
$txt['dream_portal'] = 'Dream Portal';
$txt['dp_core_modules'] = 'Collapse or Expand this Module';
$txt['dp_who_forum'] = 'Viewing the forum index of <a href="' . $scripturl . '?action=forum">' . $context['forum_name'] . '</a>.';
$txt['dp_who_portal'] = 'Viewing the portal index of <a href="' . $scripturl . '">' . $context['forum_name'] . '</a>.';
$txt['dp_who_page'] = 'Viewing the page "<a href="' . $scripturl . '?page=%1$s">%2$s</a>".';
?>
Und hier ist der REGEX, die ich zur Zeit bin mit dem tut, was ich brauche:
$data = file_get_contents('./'.$language.'/'.$file.'.'.$language.'.php');
$codes = array (
'/(\' \. \$)(.+?)(\. \')/',
'/(\= \$)(.+?)(\. \')/',
'/(\' \. \$)(.+?)(\;)/',
'/(\[\')(.+?)(\'\])/',
'/<\?php/s', '/\?>/s', '/<\?/s'
);
$html = array (
'{$2}',
'= \'{$2}',
'{$2}\';',
'[$2]',
'',
);
// Since we don't have the values for the vars.
$data = preg_replace($codes, $html, $data);
da jedoch diese Saiten ständig ändern, kann es vorkommen, dass ein String wie dies erforderlich ist/eingefügt in eine der $ txt Array-Variablen:
$txt['dp_who_page'] = 'Viewing the page "<a href="'.$scripturl.'?page=%1$s">%2$s</a>" . ';
Wo die Variable mit dem .
und dem Ende der String-Variable hat diese . ';
gerafft, die sich von dem unterscheidet, was es oben erwähnt wurde, was das war:
$txt['dp_who_page'] = 'Viewing the page "<a href="' . $scripturl . '?page=%1$s">%2$s</a>".';
In jedem dieser Fälle, ich brauche es, um das obige $ txt ['dp_who_page'] wie folgt zurückzugeben:
Anzeigen des Forenindex von {context [forum_name]}.
Derzeit funktioniert es nicht richtig mit dem 2. Fall.
Wie kann ich dies mit dem folgenden preg_replace-Code oben für beide oben aufgeführten Fälle tun? Was muss geändert werden?
Ich verwende die PHP-Funktion eval()
, um die Variablen zu extrahieren.
OK, hier ist die gesamte Funktion:
function loadLanguageFile($language, $file) {
$temp = array();
$data = file_get_contents('./'.$language.'/'.$file.'.'.$language.'.php');
$codes = array (
'/(\' \. \$)(.+?)(\. \')/',
'/(\= \$)(.+?)(\. \')/',
'/(\' \. \$)(.+?)(\;)/',
'/(\[\')(.+?)(\'\])/',
'/<\?php/s', '/\?>/s', '/<\?/s'
);
$html = array (
'{$2}',
'= \'{$2}',
'{$2}\';',
'[$2]',
'',
);
// Since we don't have the values for the vars.
$data = preg_replace($codes, $html, $data);
// We must change this because they are global.
$data = str_replace('$txt', '$langEditor_txt', $data);
$data = str_replace('$helptxt', '$langEditor_helptxt', $data);
eval($data);
if (isset($langEditor_txt)) {
$temp['txt'] = $langEditor_txt;
unset($GLOBALS['langEditor_txt']);
}
if (isset($langEditor_helptxt)) {
$temp['helptxt'] = $langEditor_helptxt;
unset($GLOBALS['langEditor_helptxt']);
}
return $temp;
}
Sie können hier gehen, um zu sehen, was ich, im Grunde zu erreichen versuchen, ich will Strings erlauben, auf Englisch übersetzt in den Sprachen zu erleichtern, wird basierend Zeichenfolgen dieser Sprachen: Language TEST using this function to load the language. Klicken Sie auf eine Sprache (derzeit nur Spanisch, Französisch, Englisch verfügbar), dann bearbeiten Sie die Sprache und Sie werden sehen, dass preg_replace wirksam wird. Wenn Sie die DreamPortal-Sprache bearbeiten, ist dies ein gutes Beispiel dafür, was sie tun soll. Auch die Standard-Textfeldfelder sind (nachdem Sie auf eine Sprache View
Link geklickt haben, als klicken Sie auf den Create It
Link) laden die englischen Zeichenfolgen aus den tatsächlichen englischen Dateien in allen Sprachen. Das preg_replace verwendet dies also, um diese spezifische Zeichenfolgendefinition in das Standardtext-Textfeld einzugeben.
Ich denke, Sie müssen Ihre Implementierung komplett überdenken. – prodigitalson
Kann mir bitte jemand helfen? Ich werde dieses preg_replace in mehreren Sprachen verwenden. Und muss die meisten, wenn nicht alle Sprachen unterstützen. Wenn die Strings bearbeitet werden müssen, damit es ein besseres System für i18n ist, lass es mich wissen, was wäre das Beste dafür? Danke :) – SoLoGHoST
Es ist wirklich schwer zu verstehen, was deine Regexes erreichen sollen. Außerdem: Verwenden Sie doppelte Anführungszeichen, wenn Sie einige Escapes ersparen. Und wenn es nur zum Übersetzen von Strings ist, benutze die verdammten gettext-Funktionen und sprintf. – mario