Jak zamienić w tekscie treść na inną tylko pomiędzy znacznikami(1).doc

(28 KB) Pobierz
[PHP] Jak zamienić w tekscie treść na inną tylko pomiędzy znacznikami np

[PHP] Jak zamienić w tekscie treść na inną tylko pomiędzy znacznikami np. [t] i [/t]?

Problem

Chcesz podmienić znaki/wyrazy tylko w pewnym, oznaczonym miejscu w tekscie.

Rozwiązanie

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 &lt;p&gt; 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("<","&lt;",$czesc2);

$czesc2 = ereg_replace(">","&gt;",$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].

 

...
Zgłoś jeśli naruszono regulamin