Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem

preg_replace_callback

Zdecydowałeś się na tworzenie interaktywnych stron przy pomocy PHP? Chcesz w łatwy i szybki sposób zarządzać danymi na swojej stronie? Tutaj znajdziesz pomoc w napotkanych przy tym trudnościach.

preg_replace_callback

Post 01.10.2017, 20:37:31

Witam!

Mam pewien problem, a mianowicie - używanie preg_replace_callback.
Posiadam taką funkcję:
Kod: Zaznacz cały
$this->template = preg_replace("/\{L_(.*)\}/isUe", "\$lang[strtolower('\\1')]", $this->template);

i muszę ją przerobić na preg_replace_callback.

Mógłby mi ktoś to przerobić i wytłumaczyć jak zostało to zrobione i dlaczego?
Z góry dziękuję za pomoc :)
Kaspian12
Posty: 36
Dołączył(a): 14.09.2013

Re: preg_replace_callback

Post 02.10.2017, 10:33:27

Jako drugi parametr ustawiasz funkcję, która oczekuje jednego parametru (nazwałem go $matches, bo nazwa dość dobrze oddaje to co się znajdzie pod tym parametrem). Funkcja musi zwrócić jakąś wartość, która zastąpi "dopasowany" fragment w tekście źródłowym. Nas interesują fragmenty {L_cokolwiek}, przy czym szczególnie ważny jest dla nas fragment "cokolwiek", dlatego używamy operatora () (capturing group). Dla każdego dopasowania, preg_replace_callback wywoła naszą funkcję, a pod $matches znajdzie się tablica, w której indeks [0] będzie pełnym dopasowaniem, oraz indeksy [1] wzwyż będą dopasowaniem poszczególnych grup (capturing group).

Kod: Zaznacz cały
$this->template = preg_replace_callback("/\{L_(?<var_name>.*)\}/isU", function ($matches) use ($lang) {
    return $lang[$matches['var_name']];
}, $this->template)


W powyższym wyrażeniu użyłem dodatkowo nazwanych grup (?<nazwa>wyrażenie), zatem możesz się odwołać do tego fragmentu przez $matches['nazwa']
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19664
Dołączył(a): 14.04.2002

Re: preg_replace_callback

Post 02.10.2017, 15:24:54

Dziękuję za odpowiedź :)
Powiedzmy, że to zrozumiałem. Przerabiając dalej:
Kod: Zaznacz cały
$this->template = preg_replace( "/" .$this->leftDelimiterF ."include file=\"(.*)\.(.*)\""
                                            .$this->rightDelimiterF."/isUe",
                                            "file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2')",
                                            $this->template );

na
Kod: Zaznacz cały
$this->template = preg_replace_callback($this->leftDelimiterF ."include file=\"(?<path>.*)\.(?<format>.*)\""
                                            .$this->rightDelimiterF,
                                            function ($match) {return file_get_contents($this->templateDir.$match['path'].'.'.$match['format']);},
                                            $this->template );


Funkcja ta znajduje "templates/header.tpl" i "templates/footer.tpl".
Aczkolwiek index.php zwraca tylko:
Kod: Zaznacz cały
{   </body>
</html>}


Plik header.tpl
Kod: Zaznacz cały
<!DOCTYPE html>
<html lang="pl">
   <head>
      <title>{$website_title}</title>
      <meta http-equiv="Content-Type" content="text/xhtml; charset=ISO-8859-1" />
   </head>
   <body>
   {include file="navigation.tpl"}


Plik footer.tpl
Kod: Zaznacz cały
   </body>
</html>


Co robię nie tak?
Kaspian12
Posty: 36
Dołączył(a): 14.09.2013

Re: preg_replace_callback

Post 02.10.2017, 15:31:34

Rozwiązałem powyższy problem. Inna funkcja była problemem. Teraz mam inne błędy, mianowicie:
"Notice: Undefined index: START in C:\wamp64\www\klasy\template.class.php on line 224",
"Notice: Undefined index: THE_TIME_IS in C:\wamp64\www\klasy\template.class.php on line 224",

Linijka 224 + funkcja ładowania języka:
Kod: Zaznacz cały
public function loadLanguage($files) {
        $this->languageFiles = $files;

        // Versuchen, alle Sprachdateien einzubinden
        for( $i = 0; $i < count( $this->languageFiles ); $i++ ) {
            if ( !file_exists( $this->languageDir .$this->languageFiles[$i] ) ) {
                return false;
            } else {
                 include_once( $this->languageDir .$this->languageFiles[$i] );
                 // Jetzt steht das Array $lang zur Verfügung
            }
        }

        // Die Sprachvariablen mit dem Text ersetzen
        $this->replaceLangVars($lang);

        // $lang zurückgeben, damit $lang auch im PHP-Code verwendet werden kann
        return $lang;
    }

    /**
     * Sprachvariablen im Template ersetzen.
     *
     * @access    private
     * @param     string $lang Die Sprachvariablen.
     * @uses      $template
     */
    private function replaceLangVars($lang) {
        $this->template = preg_replace_callback("/\{L_(?<var_name>.*)\}/isU", function ($matches) use ($lang) {
            return $lang[$matches['var_name']];
        }, $this->template); // linijka 224
    }
Kaspian12
Posty: 36
Dołączył(a): 14.09.2013

Re: preg_replace_callback

Post 02.10.2017, 16:52:57

Jak dla mnie informacja oznacza brak wpisów $lang['START'] oraz $lang['THE_TIME_IS']. Nic więcej nie jestem w stanie powiedzieć na podstawie powyższych fragmentów.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19664
Dołączył(a): 14.04.2002

Re: preg_replace_callback

Post 02.10.2017, 16:58:27

Dokładnie tak. Napisałem to małymi literami w pliku z językiem ... Dziękuję niezmiernie za pomoc :) Do zamknięcia
Kaspian12
Posty: 36
Dołączył(a): 14.09.2013


Powrót do PHP i bazy danych


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 gości

Hosting, Domeny, SSL

Subskrypcja

Mamy 50881 zarejestrowanych użytkowników.
Najnowszy użytkownik: netprogs


Nasi użytkownicy napisali:

  • 936353 wiadomości
  • w 246826 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)