Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne zamiana 2 pod rząd
Forum PHP.pl > Forum > PHP
Bielo
mam taki kod
Kod
[url]http://www.kurs.prv.pl[/url]

[url=http://www.kurs.prv.pl]Kurs[/url]


teraz zamieniam go czymś takim
[php:1:fc70b94cec]<?php
function code($tekst)
{
$tekst=ereg_replace("(.+)","<a href="1">1</a>",$tekst);
$tekst=ereg_replace("(.+)","<a href="1">2</a>",$tekst);
return highlight_string($tekst,TRUE);
}
?>[/php:1:fc70b94cec]

i on zwraca mi

[xml:1:fc70b94cec]<a href="http://www.kurs.prv.pl[/url]
<a href="http://www.kurs.prv.pl">Kurs">http://www.kurs.prv.pl</a>
[url=http://www.kurs.prv.pl]Kurs</a> [/xml:1:fc70b94cec]
zamiast
[xml:1:fc70b94cec]<a href="http://www.kurs.prv.pl">http://www.kurs.prv.pl</a>
<a href="http://www.kurs.prv.pl">Kurs</a> [/xml:1:fc70b94cec]
FiDO
Sprobuj czegos takiego:
[php:1:43af3b25b6]<?php

function makelink($match)
{
$text = (empty($match[2]))? $match[1] : $match[2];

/* jeśli link zaczyna się od http:// lub ./ (link relatywny) to nie zmieniamy nic */
if (strpos($match[1],"http://") === 0 || strpos($match[1],"./") === 0)
return '<a href="'.$match[1].'">'.$text.'</a>';
else
return '<a href="http://'.$match[1].'">'.$text.'</a>';
}


/* [ url=http://www.link.com][/url] */
$txt = preg_replace_callback('!]*)](.*)!U','makelink', $txt);
/* [ url]www.link.com[/url] */
$txt = preg_replace_callback('!(.*)!U','makelink', $txt);

?>[/php:1:43af3b25b6]
Dodatkowo jest sprawdzane czy link zawiera http:// na poczatku i w razie gdy nie ma to jest automatycznie dodawane.
Jak masz pytania do kodu to śmiało.
Bielo
[php:1:f0e1337592]<?php
$tekst=ereg_replace("([^[]*)","<a href="1">1</a>",$tekst);
$tekst=ereg_replace("*)]([^[]*)","<a href="1">2</a>",$tekst);
?>[/php:1:f0e1337592]

To mi zamienia linka tak jak trzeba tylko, że podsunąłeś mi pomysł żeby zrobić dodawanie "http://".
Teraz chcę "wyłączyć" przed nawias http(jeśli jest)
[php:1:f0e1337592]<?php
$tekst=ereg_replace("http://([^[]*)","<a href="http://1">1</a>",$tekst);
$tekst=ereg_replace("*)]([^[]*)","<a href="http://1">2</a>",$tekst);
?>[/php:1:f0e1337592]

tylko co teraz zrobic żeby wyrażenie pasowało gdy nie ma "http://"?
FiDO
Zobacz tak:
Kod
[url=((http://)?([^[]*))]([^[]*)[/url]
Bielo
dzięki!

teraz następne pytanie...
[php:1:3660fe94fc]<?php
$tekst=ereg_replace("
Kod
([^[]*)
","<p style="background-color: #ffffff; border: solid #Ed9438 1px">1</p>",$tekst);
?>[/php:1:3660fe94fc]

i chcę żeby wynikiem tego był kod w ramce z ponumerowanymi liniami.
FiDO
To juz kwestia wygenerowania odpowiedniego html'a.

Moze to Ci pomoze: http://forum.php.pl/viewtopic.php?t=5054
BzikOS
Wracając do semego BBCode -> HTML... może ten wątek Ci się przyda.
Bielo
FiDO style nie mają tu niestety nic do rzeczy(niestety bo się na nich trochę znam aaevil.gif )

BzikOS z tymi znacznikami juz sobie poradziłem biggrin.gif .

to co ja chce zrobić to jest wyświetlenie tekstu z ponumerowanymi liniami.

kod który wpisuję:
Kod
[php]linia1

linia2

linia3

linia4[/php]


wynik:
[php:1:afaeb97f9c]<?php
linia1
linia2
linia3
linia4
?>[/php:1:afaeb97f9c]
FiDO
Style nie maja, masz racje. Wcale tak nie twierdzilem. Bylo trzeba jednak kliknac w linka, ktory jest w tamtym topicu to zobaczylbys przyklad kodu z numerowaniem.
Bielo
i widzę zę robisz to
[xml:1:0d0b768f79]
<table>
<tr>
<td>
<code>1<br>
2<br>
3<br>
4<br>
5<br>
itd.</code></td>
<td><code>linia1<br>
linia1<br>
linia2<br>
linia3<br>
linia4<br>
linia5<br>
itd.</code></td></tr><table>[/xml:1:0d0b768f79]

tylko teraz nie wiem jak zamienić
Kod
[php]<?kod php

komentarze

funkcje:

highlight_source();

[/php]

na taką tabelkę jaką Ty zrobiłeś
FiDO
Przeanalizuj to: http://stargate.uz.zgora.pl:81/~fido/mozil...illa.php?source
Bielo
z tym sobie poradziłem fajnie to wymyśliłeś z ob.

teraz znow powracając do ereg replace.
Powioedzcie co w tym jest źle.

[php:1:685ca7fdb2]<?php
$tekst=ereg_replace("[kod]^([kod])*[/kod]","<table><tr><td style="font-weight: bold">Kod:</td></tr><tr><td style="background-color: #ffffff; border: solid #Ed9438 1px">".str_replace("]","]",str_replace("[","[",htmlentities("1",TRUE)))."</td></tr></table>",$tekst);
?>[/php:1:685ca7fdb2]

chcę żeby w zamienianym ciągu nie można było wstawić znacznika "[kod]"
FiDO
Co Cie tak ciagle trzyma przy tych "ereg"'ach?? Przeciez "preg"'i sa szybsze i maja wieksze mozliwosci...

[php:1:5b69d39a4c]<?php

function zamien_kod($matches)
{
/* jesli taki ciag istnieje to zwracamy niezmieniony ciag */
if (strpos($matches[1],"[kod]") !== FALSE)
return $matches[0];

$s = "<table><tr><td style="font-weight: bold">Kod:</td></tr><tr><td style="background-color: #ffffff; border: solid #Ed9438; 1px">";
$s.= str_replace(array("]","["), array("]","["), htmlentities($matches[1], true));
$s.= "</td></tr></table>";

return $s;
}

$tekst = preg_replace_callback("![kod](.+)[/kod]!U", "zamien_kod", $tekst);

?>[/php:1:5b69d39a4c]
I jeszcze wersja extended, ktora moze byc zastosowana bardziej uniwersalnie, dla kilku roznych bbcode'ow, sama sprawdza czy w srodku nie znajduje sie poczatkowy tag tego bbcode'u:
[php:1:5b69d39a4c]<?php

function zamien_kod($matches)
{
if (strpos($matches[2], $matches[1]) !== FALSE)
return $matches[0];

$s = "<table><tr><td style="font-weight: bold">Kod:</td></tr><tr><td style="background-color: #ffffff; border: solid #Ed9438; 1px">";
$s.= str_replace(array("]","["), array("]","["), htmlentities($matches[2], true));
$s.= "</td></tr></table>";

return $s;
}

$tekst = preg_replace_callback("!([kod])(.+)[/kod]!U", "zamien_kod", $tekst);
$txt = preg_replace_callback("!([inny_tag])(.+)[/inny_tag]!U", "zamien_kod", $txt);
?>[/php:1:5b69d39a4c]
party
Nom, pregi są lepsze np. pod tym względem, że możesz do nich wrzucać tablice:
[php:1:4cf86383f6]<?php
$tekst = 'jakis tekst & inny & ble';

$a = array( 'jakis tekst', 'inny', 'ble' );
$b = array( 'jakis inny tekst', 'to samo', 'bla' );

$tekst = preg_replace( $a, $b, $tekst ); // zwroci: jakis inny tekst & to samo & bla
?>[/php:1:4cf86383f6]
Cudi
Cytat
z tym sobie poradziłem fajnie to wymyśliłeś z ob.

Cytat
mixed highlight_string ( string str [, bool return])
If the second parameter return is set to TRUE then highlight_string() will return the highlighted code as a string instead of printing it out. If the second parameter is not set to TRUE then highlight_string() will return TRUE on success, FALSE on failure.

W przypadku kolorowania składni buforowanie wyjścia nie jest potrzebne. W higlight_*() i kilku innych funkcjach (np. print_r()) w php 4.2.0 wprowadzono dodatkowy parametr return, który pozwala wymysić zwrócenie ciągu tekstu zamiast wysyłania go do przeglądarki.
Bielo
Dzięki fido przechodzę na pregi kolorowanie składni też już zrobiłem tylko jak dodać obsługę multiline'a chyba trzeba dodać /m albo /s tylko nie wiem gdzie :?
FiDO
Flagi w preg'ach dodaje sie w ten sposob:
Kod
/wyrazenie/flagi

Np.
Kod
#[kod](.+)[/kod]#U

Wyrazeniem jest [kod](.+)[/kod], a flagą U.
Jak widac jako separator wyrazenia mozna stosowac dowolne znaki (byle poczatkowy i koncowy byl taki sam), najlepiej wybrac taki, ktorego nie ma w wyrazeniu, bo gdyby byl to trzebaby go wyescape'owac backslashem.

Flagi wypisuje sie literka po literce, czyli jak ma byc ich wiecej to piszesz:
Kod
/wyrazenie/Usi

, gdzie U, s, i to flagi.
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.