Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]zamiana fragmentów ciagu
Forum PHP.pl > Forum > Przedszkole
mateuszpi
Witam mam coś takiego
  1. <?php
  2. $dane="tekst tekst tekst<a href=34524>opis</a> i tutaj znowu sporo tekstu";
  3. ?>

teraz potrzebuje z $dane wykasować fragment o linku czyli: <a href=34524>opis</a>
nie było by problemu gdyby te cyfry były stałe. funkcja str_replace() załatwia sprawe. ale niestety cyfry w tym kodzie mogą się zmieniać i dlatego prosze was o pomoc. chce wkasować wszystko z kodem <a href..(dowolna wartość)../a>
JoShiMa
Zaprzyjaźnij się z wyrażeniami regularnymi i funkcją preg-replace()


  1. <?php
  2. $nowe_dane = preg_replace('/(<a(.)*>)/','',$dane);
  3. ?>
1010
a może po prostu chcesz pozbyć się html?

strip_tags" title="Zobacz w manualu PHP" target="_manual może Ci pomoże...
mateuszpi
Cytat
a może po prostu chcesz pozbyć się html?

wręcz przeciwnie chce kasować tylko linki. reszta ma zostać. w reszcie jest kod html biggrin.gif

JoShiMa właśnie takiej odpowiedzi się bałem. czytałem sporo o wyrażeniach regularnych ale za żadne skarby nie moge ich pojąć. do tej pory udawało mi się je omijać ale teraz chyba nie mam jak.

twój kod który podałeś faktycznie znajduje i usuwa całe polecenia <a href jednak znika również to co jest za nimi. czyli z przykładu
$dane="tekst pierwszy <a href=fsdfsdfd>fsdfs</a> tekst drugi <a href=dadasd>fdsaffd</a> tekst trzeci";

pozostaje mi tylko "tekst pierwszy" a chciałbym tekst drugi i trzeci też zobaczyć biggrin.gif
Moge prosić o dokładny kod bo raczej sam tych wyrażej nie rozgryze.
elemek
  1. <?php
  2. $dane="tekst pierwszy <a href=fsdfsdfd>fsdfs</a> tekst drugi <a href=dadasd>fdsaffd</a> tekst trzeci";
  3. echo preg_replace('#<as+.*?</a>#i', '', $dane);
  4. ?>
mateuszpi
i oto chodziło. kilka znaczków i po problemie a ja kurka dzień nad wyrażeniami strawiłem. dzięki panowie. macie po plusiku, w porywach stawiam piwko jeśli jesteście z okolic jaworzna
JoShiMa
Cytat(mateuszpi @ 9.09.2008, 20:25:33 ) *
JoShiMa właśnie takiej odpowiedzi się bałem. czytałem sporo o wyrażeniach regularnych ale za żadne skarby nie moge ich pojąć. do tej pory udawało mi się je omijać ale teraz chyba nie mam jak.

To błąd trzeba ćwiczyć, ćwiczyć i jeszcze raz ćwiczyć smile.gif Wyrażenia regularne wiele rzeczy upraszczają. A jak chcesz się ich pouczyć to się zainteresuj książkami do PERLa.

Aha i masz tu link do testera wyrażeń regularnych. Bardzo przydatne narzędzie jak się ćwiczy.


Cytat(mateuszpi @ 9.09.2008, 20:25:33 ) *
twój kod który podałeś faktycznie znajduje i usuwa całe polecenia <a href jednak znika również to co jest za nimi. czyli z przykładu
$dane="tekst pierwszy <a href=fsdfsdfd>fsdfs</a> tekst drugi <a href=dadasd>fdsaffd</a> tekst trzeci";
pozostaje mi tylko "tekst pierwszy" a chciałbym tekst drugi i trzeci też zobaczyć biggrin.gif
Moge prosić o dokładny kod bo raczej sam tych wyrażej nie rozgryze.

Aha... Tego, że masz tam w tekście więcej niż jeden link to nie powiedziałeś. Tak naprawdę powinien zostać tekst pierwszy i tekst trzeci. Zaraz coś pokombinuję.

Aaaa. Już masz smile.gif


mateuszpi nudzi mi się to Ci wyjaśnię różnicę w moim wyrażeniu regularnym i w rozwiązaniu elemka.

Zaproponowane przez niego
  1. <?php
  2. preg_replace('#<as+.*?</a>#i', '', $dane);
  3. ?>


Mozna zapisac również w następujący sposób:
  1. <?php
  2. preg_replace('/<a.*?/a>/', '', $dane);
  3. ?>


Możesz sprawdzić, że zadziałają tak samo a to już jest bardzo podobne to tego co ja Ci zaproponowałam:
  1. <?php
  2. preg_replace('/(<a(.)*>)/','',$dane);
  3. ?>


Zasadnicza różnica tkwi w tym, że u elemka jest *? a u mnie *

* oznacza dopasowanie 0 lub więcej razy i jest kwantyfikatorem maksymalistycznym
*? też oznacza dopasowanie 0 lub więcej razy ale jest kwantyfikatorem minimalistycznym

Dlatego użycie * dopasuje ciąg od pierwszego <a do ostatniego /a> bo stara się dopasować jak najdłuższy ciąg znaków pasujący do wzorca, natopmiast użycie *? dopasuje najkrótsze możliwe ciągi między <a i /a> i w przypadku gdy w tekście masz kilka odnośników powycina ci je zgodnie z Twoimi oczekiwaniami.
mateuszpi
ok. dzięki za wyjaśnienia. posiedze nad nimi bo chyba faktycznie może się wiedza przydać.
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.