Skocz do zawartości

[PHP] Highlight


Rekomendowane odpowiedzi

Chciałbym zrobić taki mały bajer. Mam tablicę:

$array = new array { "ale",
"fajny",
"tekst" }; // nie wiem, chyba tak się tworzy nowy obiekt tablicy

Mam jeden string, np.:

$string = file_get_contents( $fname );

I jeśli np. wartość tej zmiennej to:

hejka to jest    fajny\n\t\ttekst   i  \n odporny   na  białe   znaki,   ale czy na pew\tno?

Chciałbym zamienić na:

hejka to jest    <span style="color: blue;">fajny</span>\n\t\t<span style="color: blue;">tekst</span>   i  \n odporny   na  białe   znaki,   <span style="color: blue;">ale</span> czy na pew\tno?

Oczywiście z pewnością użyta zostanie pętla krokowa, np. :

for( $i = 0; $i < sizeof( $array ); ++$i )
  if ( $array[ $i ] == $temp )
    ...

Da mi ktoś jakiś nawydajniejszy kod? Oczywiście podany na tacy i posiekany na kawałeczki :) .

Odnośnik do komentarza
Udostępnij na innych stronach

Piczer, on mówił o wydajnym kodzie ;)

 

#Pental

<?php
$array = array( "ale",
"fajny",
"tekst" );

$string = file_get_contents( $fname );

foreach( $array as $rpl )
{
str_replace( $rpl, '<span style="color: blue;">' . $rpl . '</span>', $string );
}
?>

Rozwiązanie pisane na szybko, aczkolwiek powinno wystarczyć. Z wydajnością nie wiem jak. ;)

btw.

Niestety w PHP typy danych nie są obiektami. Dziwne, ale prawdziwe. ;P

Odnośnik do komentarza
Udostępnij na innych stronach

Haha, potraktuję to jako żart :D . Spodziewałem się chociaż 10 linijek :P . Dzięki wielkie :) . Czy to się nadaje na kolorowanie składni GMLa? Bo robię stronę z kursami GMLa i chcę, aby wygodnie się edytowało lekcje, był kod a'la BBCode, no i kolorowanie składni GMLa, które jest imho niezbędne.

Odnośnik do komentarza
Udostępnij na innych stronach

@Kofel: Tablicę możesz podać jako argument str_replace i foreach staje się zbędny.

Tak, ale dla tego przypadku to nie będzie działało bo wtedy też do drugiego argumentu musimy wprowadzić tablicę. :) A to raczej nie bedzie wygodne.

 

Poprawka:

<?php
$array = array( "ale",
"fajny",
"tekst" );

$string = 'fajny tekst, ale glupi';

foreach( $array as $rpl )
{
    $string = str_ireplace( $rpl, '<span style="color: blue;">' . $rpl . '</span>', $string );
}
?>

 

#Pental

Da się, ale do tego str_replace Tobie nie wystarczy :P

 

EDIT:

Zastąpiłem str_replace na str_ireplace

Odnośnik do komentarza
Udostępnij na innych stronach

Weź idź Piczer z taką odpowiedzią. Mi chodzi o same pokazanie, jak to zrobić, ale wiedziałem, że albo nic nie napiszesz, bo nie będziesz wiedział, albo się do składni przyczepisz...

Pokazałem, jak to zrobić, użyj wyrażeń regularnych. Ślepy? Mamy odwalić za ciebie połowę kodu? Lepiej dla ciebie by było jakbyś poszperał po necie, jak to zrobić, nauczyłbyś się korzystać google.

A jeśli oni dali wydajniejszy sposób, to użyj ich. Proste.

Odnośnik do komentarza
Udostępnij na innych stronach

Najwyraźniej ty jesteś ślepy, wyraźnie napisałem, że chcę gotowe rozwiązanie, ew. kod.

 

Kofel, ale jeśli kod piszę tylko ja i jest dobry, to wystarczy :P . Ja teraz myślę, o takim rozwiązaniu:

$input = file_get_contents( $fname );
$output = "";

function check_next( $char )
{
  $temp = "()<>][{}/\| ";
  for( $x = 0; $x < strlen( $temp ); ++$x )
  {
     if ( substr( $temp, $x, 1 ) == $char )
       return true;
  }
  return false;
}

for( $i = 0; $i < strlen( $input ); ++$i )
{
  $done = false;
  for( $t = 0; $t < sizeof( $array1 ); ++$t )
  {
     if ( $array1[ $t ] == substr( $input, $i, strlen( $array1[ $t ] ) )
     {
        if ( check_next( substr( $input, $i + strlen( $array1[ $t ] ), 1 ) ) )
        {
           $output .= "<span style='color: blue;'" . substr( $input, $i, strlen( $array1[ $t ] ) . "</span>";
           $i += strlen( $array1[ $t ] ) - 1;
           continue;
           $done = true;
        } 
     }
  }
  if ( !$done )
  {
    $output .= substr( $input, $i, 1 );
  }
}

Co o tym sądzicie? A, jak do tablicy w PHP wczytać każdą linię z pliku :P ?

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra, po sprawie, sam wpadłem jakoś jak to zrobić. Tylko jedno pytanie - mam kod:

      <?php
        function gml( $fname )
        {
          $a1 = file( "funkcje.txt" );
          $input = file_get_contents( $fname );
          $output = "";
          for ( $i = 0; $i < strlen( $input ); ++$i )
          {
            foreach( $a1 as $c )
            {
              $d = rtrim( $c );
              if ( $d == substr( $input, $i, strlen( $d ) ) )
              {
                $output .= "<span style='color: blue'>" . $c
                . "</span>";
                $i += strlen( $d );
                continue;
              }
            }
            $output .= substr( $input, $i, 1 );
          }
          
          return $output;
        }
        
        echo gml( 'skrypt.txt' ); 
      ?>

I pytanko - jak dobrze zrobić, kombinując z nl2br, żeby były entery?

 

#Edit - Jej, co za głupie pytanie, przed file_get_contents() było dać i po sprawie. Dzięki za pomoc :) .

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
Tak, ale dla tego przypadku to nie będzie działało bo wtedy też do drugiego argumentu musimy wprowadzić tablicę. :) A to raczej nie bedzie wygodne.
Oczywiście że będzie działało, następnym razem lepiej dokładnie sprawdź zanim coś napiszesz.

 

echo str_replace( array( 'ale', 'fajny', 'tekst' ), 'x', 'ale fajny tekst' );

Odnośnik do komentarza
Udostępnij na innych stronach

W sumie możesz zrobić globalną z taką tablicą.

$_funkcje = null;

function gml()
{
   global $_funkcje;
   if( $_funkcje === null )
      $_funkcje = file( 'funkcje.txt' );

   ...
}

Wtedy jesteś już fajny. =P

 

Btw. preg_replace i tak jest fajniejsze.

Odnośnik do komentarza
Udostępnij na innych stronach

Oczywiście że będzie działało, następnym razem lepiej dokładnie sprawdź zanim coś napiszesz.

 

echo str_replace( array( 'ale', 'fajny', 'tekst' ), 'x', 'ale fajny tekst' );

No świetny jesteś. Ale przecież wtedy nie zrobisz tego o co prosił Pental z użyciem str_replace.... -.-

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...