[PHP] Jak zamienić w tekscie treść na inną tylko pomiędzy znacznikami np. [t] i [/t]?
Chcesz podmienić znaki/wyrazy tylko w pewnym, oznaczonym miejscu w tekscie.
Przetwarzając tekst można oznaczać pewne jego fragmenty, które mają ulegać zmianie, tak aby reszta nie została naruszona. Weźmy przykładowy ciąg znaków, w którym tylko nawiasy trójkątne zawarte pomiędzy naszymi znacznikami [t] i [\t] mają zostać zamienione na odpowiadające im encje: < i >:
<p> tekst [t] z trójkątnymi <p> nawiasami [/t] do podmiany <p>
Po zamianie tekst ma wyglądać tak:
<p> tekst [t] z trójkątnymi <p> nawiasami [/t] do podmiany <p>
W ten sposób zmieniamy tekst tylko w określonym regionie. W naszym wypadku dwa skrajne znaczniki P mają być paragrafami HTML, a znacznik P wewnątrz ma charakter informacyjny, więc powinien zostać pokazany na ekranie.
Realizacja podmiany wewnątrz określonego ciągu możliwa jest dzięki użyciu wyrażeń regularnych i ekstrakcji łańcuchów. Zobacz jak podobną operację można przeprowadzić w praktyce.
<?
$test = "<p> tekst [t] z trójkątnymi <p> nawiasami [/t] do podmiany <p>";
$czesc2 = preg_replace("/(.*?)(\[t\].*?\[\/t\])(.*)/i","\\2",$test);
$czesc2 = ereg_replace("<","<",$czesc2);
$czesc2 = ereg_replace(">",">",$czesc2);
$calosc = preg_replace("/(.*?)(\[t\].*?\[\/t\])(.*)/i","\\1$czesc2\\3",$test);
echo $calosc;
?>
W pierwszym wyrażeniu regularnym rozbiłem ciąg znaków na trzy części umieszczone w nawiasach. Pierwsza (.*?) oznacza wszystko aż do wystąpienia drugiej (\[t\].*?\[\/t\]) czyli oznaczonego odpowiednio ciągu, a trzecia oznacza resztę (.*).
Funkcja preg_replace() podmienia znaleziony ciąg znaków na drugą część, do której odwołuję się poprzez symbol \\2. Czyli z całego wyrażnia pozostaje tylko to co było w drugim nawiasie i przypisywane jest to do zmiennej $czesc2.
Teraz w wyrażeniu $czesc2 zmieniam to co chciałem podmienić, a więc trójkątne nawiasy na odpowiadające im encje. Następnie podmieniam oryginalny ciąg znaków $test na nowy, używając odwołania do pierwszej pary nawiasów, podmienionego ciągu i trzeciej pary nawiasów, co w sumie daje stary ciąg z nową, środkową wartością.
Całość przypisuję do nowej zmiennej $calosc, która przechowuje już całe wyrażenie z podmienioną zawartością, oznaczoną przez nas znacznikami [t] i [\t].