Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: str_replace, zamiana w plikach, tabulatory i nowe linie
Forum PHP.pl > Forum > PHP
daris
Mam taki sktypt:
  1. <?php
  2. if (strpos($file, $find) != false)
  3.  $file = str_replace($find, $code, $file);
  4. else
  5.  $error = $lang['Text not found'];
  6. ?>

który dokonuje zamiany tekstu ($find) na inny ($code) w otwartym pliku ($file). I teraz wszystko działa dobrze dopóki w tekście do znalezienia ($find) nie znajdą się nowe linie (w sumie to nie wiem czy problemem są nowe linie czy tabulatory). "Wyechowanie" tego tekstu w <pre> pokazuje wszystkie linie i tabulatory normalnie. Do wczytywania pliku używam file_get_contents a do zapisywania file_put_contents.

edit: Dopiero teraz się przyjrzałem i dochodzę do wniosku że to jednak nie str_replace może być powodem a raczej strpos, bo wyrzuca tego errora że tekst nie znaleziony (czyli idzie przez "else" tongue.gif ).
nowotny
Cytat(daris @ 3.02.2008, 16:58:03 ) *
który dokonuje zamiany tekstu ($find) na inny ($code) w otwartym pliku ($file). I teraz wszystko działa dobrze dopóki w tekście do znalezienia ($find) nie znajdą się nowe linie (w sumie to nie wiem czy problemem są nowe linie czy tabulatory).

No ale co się wtedy dzieje...? i co do tego mają nowe linie i tabulatory...?
daris
To że jak pisałem wyżej jeśli $find ma więcej niż jedną linię to zamiast przejść przez if'a to przechodzi przez else biggrin.gif

A tabulatory mogą mieć coś z tym wspólnego bo plikiem ($file) jest skrypt php (z wcięciami)

A i jeszcze zapomniałem dodać że przed zamienieniem trim'uje $find'a (bo ma na początku i na końcu pustą linię)
nowotny
Cytat(daris @ 3.02.2008, 17:11:02 ) *
To że jak pisałem wyżej jeśli $find ma więcej niż jedną linię to zamiast przejść przez if'a to przechodzi przez else biggrin.gif

To nie jest odpowiedź na poziomie kodera php, no ale niech będzie... tongue.gif

Tak bez sczegółów trudno powiedzieć... spróbuj użyć '!==' zamiast '!='... zapodaj też wartości zmiennych $file i $find...
daris
Cytat(nowotny)
zapodaj też wartości zmiennych $file i $find...

Z tym to będzie raczej problem bo to leci przez pętelkę biggrin.gif

To jest fragment pliku:
  1. <?php
  2. #
  3. #---------[ 4. OPEN ]---------------------------------------------------------
  4. #
  5.  
  6. header.php
  7.  
  8.  
  9. #
  10. #---------[ 5. FIND (line: 176) ]---------------------------------------------
  11. #
  12.  
  13. else
  14. $tpl_temp .= "\n\t\t\t".'</ul>'."\n\t\t\t".'<div class="clearer"></div>'."\n\t\t".'</div>';
  15.  
  16. #
  17. #---------[ 6. BEFORE, ADD ]--------------------------------------------------
  18. #
  19.  
  20. // MOD: MARK TOPICS AS READ - 2 LINES NEW CODE FOLLOW
  21. else if (basename($_SERVER['PHP_SELF']) == 'viewforum.php')
  22. $tpl_temp .= '</ul>'."\n\t\t\t".'<p class="conr"><a href="misc.php?action=markforumread&id='.$id.'">'.$lang_common['Mark forum as read'].'</a></p>'."\n\t\t\t".'<div class="clearer"></div>'."\n\t\t".'</div>';
  23.  
  24. #
  25. #---------[ 7. OPEN ]---------------------------------------------------------
  26. #
  27.  
  28. include/functions.php
  29. ?>

który parsuję wyrażeniami regualrnymi po kolei (numerkami), i każda "akcja" zostaje wykonywana. Wszystko działa dobrze dopóki w wykonywanym fragmencie (tylko FIND) nie znajdzie się więcej jak jedna linia (ale jak "wyechuje" fragment w <pre> to tekst zawiera i tabulatory i nowe linie).

edit: W powyższym przykładzie możliwe że te \n\t... też przeszkadzają, ale dalej jak nie ma \n\t też nie działa (tylko wtedy kiedy jest więcej niż jedna linia)


edit2: To wyrażenie regularne nie za każdym razem chce działać (na niektórych plikach działa a na niektórych nie):
  1. <?php
  2. preg_match("/#-*[.$i..([A-Z,s*/]*)..*].*s#s*(([^#].*\n)*)s*#/", $install, $section);
  3. $type = trim($section[1]);
  4. $code = trim($section[2]);
  5. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.