Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML] Zamknięcie tagu img, wyrażenia reguralne, preg
Forum PHP.pl > Forum > Przedszkole
Zdunek
Witam

Tworzę portal na bazie IPB i muszę dokonać konwersji img na zgodny ze specyfikacją w3c
sam kod który dostaję z ipb
<img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" emoid=":)" alt="smile.gif" border="0">
bez problemu udało mi się zmienić ścieżkę($dane=str_replace('style_emoticons/%3C#EMO_DIR#%3E', $this->forum_adres.'style_emoticons/default', $dane) winksmiley.jpg
oraz usunąć emoid="*" ($dane=preg_replace('#emoid=\"[^\"]+"#', "", $dane) winksmiley.jpg
i pozostaje problem zamknięcia tagu />
nie mam bladego pojęcia jak to zrobić

Z góry dzięki za pomoc

Pozdrawiam
Zdunek
isso
a nie masz dostępu bezpośrednio do kodu html;> ?
Zdunek
Cytat(isso @ 1.02.2009, 15:46:07 ) *
a nie masz dostępu bezpośrednio do kodu html;> ?


chodzi o to że wyciągam dane z bazy danych, w tym przypadku emotikony i jak ktoś doda emotkę w poście który będzie chociażby w komentarzach na portalu to już się kaszani, a chcę by portal był w pełni zgodny z w3c
isso
wydaje mi się, że ciężko będzie napisać takie wyrażenie regularne... prędzej bym pozamykał wszystkie ikonki smile.gif ale to też cale życie zajmie smile.gif
Zdunek
myślałem żeby ew. <img * > zamienić na <img * ></img>
ale nie mam za bardzo pomysłu jak to zrobić
Pax95
hmm... A może to wyglądać tak?:

  1. <?php
  2. $KeysToChange = array( 'img', 'br', 'hr' );
  3. foreach ( $KeysToChange as $Value )
  4. {
  5.   // Zamień znaczniki <$Value> na <$Value />
  6. }
  7. ?>
Zdunek
Cytat(Pax95 @ 1.02.2009, 17:09:00 ) *
hmm... A może to wyglądać tak?:

  1. <?php
  2. $KeysToChange = array( 'img', 'br', 'hr' );
  3. foreach ( $KeysToChange as $Value )
  4. {
  5.   // Zamień znaczniki <$Value> na <$Value />
  6. }
  7. ?>

może, ale chodzi o flaki img, by były te same...
Pax95
flaki? Spróbowałbym coś napisać, ale nie umiem pisać wyrażeń regularnych dla preg (mogę coś spróbować z ereg).
Zdunek
Cytat(Pax95 @ 1.02.2009, 17:18:53 ) *
flaki? Spróbowałbym coś napisać, ale nie umiem pisać wyrażeń regularnych dla preg (mogę coś spróbować z ereg).

flaki czyli wszystko co jest w znaczniku html
<img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" emoid=":)" alt="smile.gif" border="0">
nie ważne czy w preg, czy ereg, ważne by działało
Byłbym bardzo wdzięczny za napisanie tego winksmiley.jpg
Pax95
Pewnie coś zrobiłem źle, ale zobaczymy winksmiley.jpg - będziemy myśleć dalej

  1. <?php
  2. $SourceCode = ereg_replace( "<[:blank:]*" .$Value. "(.*)>", "<" .$Value. " 1 />", $SourceCode );
  3. ?>
Zdunek
po małych przeróbkach działa idealnie, dzięki
Edit:Chociaż nie
$dane=ereg_replace( "^<img" .$Value. "(.*)>$", "<img".$Value. " \\1 />", $dane );
takich ciągów z obrazkami jest kilka, podmienia mi tylko ostatni biggrin.gif
Pax95
Czemu nie pozostawiłeś takiego, jaki ci dałem?

  1. <?php
  2. $dane=ereg_replace( "<img(.*)>", "<img 1 />", $dane );
  3. ?>
Zdunek
Cytat(Pax95 @ 1.02.2009, 18:57:04 ) *
Czemu nie pozostawiłeś takiego, jaki ci dałem?

  1. <?php
  2. $dane=ereg_replace( &#092;"\", \"<img 1="">\", $dane );
  3. ?>

ciągle podmienia ostatni img
zmieniłem bo chcę by zamykało samo img oraz ustawiłem początek^ i koniec$
jeszcze zauważyłem jedną rzecz, jeśli img jest domknięty to dorzuca jeszcze jedno /
Pax95
^ i $ oznaczają koniec stringu, nie wyrażenia regularnego.

Spróbuj tak:
  1. <?php
  2. $dane=ereg_replace( "<img(.*)/*>", "<img 1 />", $dane );
  3. ?>
Zdunek
nadal zamyka tylko ostatni, zdaje mi się że to z tego kodu
<img src="ipb/style_emoticons/default/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0"><img src="ipb/style_emoticons/default/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0"><div id="all">
zaczyna się na pierwszym otwarciu <img a kończy na drugim zamknięciu > wyciąga wszystko w środku, a dla tego że po pierwszym <img robi się dodatkowa spacja
<img src="ipb/style_emoticons/default/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0"><img src="ipb/style_emoticons/default/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0" /><div id="all">
Pax95
Nie wiem, jaka jest tego przyczyna, możemy dalej kombinować.

  1. <?php
  2. $dane=ereg_replace( "<img(.*)(/>|>)", "<img 1 />", $dane );
  3. ?>
Zdunek
Cytat(Pax95 @ 1.02.2009, 19:19:41 ) *
Nie wiem, jaka jest tego przyczyna, możemy dalej kombinować.

  1. <?php
  2. $dane=ereg_replace( &#092;"|>)\", \"<img 1="">\", $dane );
  3. ?>

ciągle to samo
daję tak mniej wiecej uproszczony kod bez funkcji, wraz z danymi
  1. <?php
  2. $dane='<img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" emoid=":)" alt="smile.gif" border="0"><img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" emoid=":)" alt="smile.gif" border="0">';
  3. $dane=str_replace('http://forum.php.pl/style_emoticons/%3C#EMO_DIR#%3E', 'ipb/style_emoticons/default', $dane);
  4. $dane=preg_replace('#emoid=\"[^\"]+"#', "", $dane);
  5. $dane=ereg_replace( "<img(.*)(/>|>)", "<img 1 />", $dane );
  6. echo $dane;
  7. ?>
Pax95
  1. <?php
  2. $dane=ereg_replace( "<img([a-zA-Z0-9=/\":-;().][:blank:])*>", "<img 1 />", $dane );
  3. ?>


Ten powinien działać, ale nie jest uniwersalny! W
Kod
[a-zA-Z0-9=/":-;().]
dodawaj między [ i ] znaki, które znajdują się w <img >
Zdunek
niestety nie działa
Pax95
A powinno. Coś zrobiłem źle, ale przynajmniej wiem, czemu wtedy nie działało. Niech ktoś inny poprawi.
Zdunek
na bazie tego kodu znajomy mi pomógł ale pregiem
  1. <?php
  2. $dane=preg_replace("#<img([^>]+[^/])>#", "<img 1/>", $dane );
  3. ?>

Wielkie dzięki za pomoc
zegarek84
Kod
$dane='<img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" emoid=":)" alt="smile.gif" border="0"><img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" emoid=":)" alt="smile.gif" border="0">';
$dane=preg_replace('/<img src\="style_emoticons\/%3C#EMO_DIR#%3E\/([^"]+?)" style\="([^"]+?)" emoid="[^"]*?"([^>]+?)>/', '<img src="ipb/style_emoticons/default/\1" style="\2"\3 />', $dane);
echo $dane;


daje:
Kod
<img src="ipb/style_emoticons/default/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0" /><img src="ipb/style_emoticons/default/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0" />
Zdunek
Cytat(zegarek84 @ 1.02.2009, 20:10:52 ) *
Kod
$dane='<img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" emoid=":)" alt="smile.gif" border="0"><img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" emoid=":)" alt="smile.gif" border="0">';
$dane=preg_replace('/<img src\="style_emoticons\/%3C#EMO_DIR#%3E\/([^"]+?)" style\="([^"]+?)" emoid="[^"]*?"([^>]+?)>/', '<img src="ipb/style_emoticons/default/\1" style="\2"\3 />', $dane);
echo $dane;


daje:
Kod
<img src="ipb/style_emoticons/default/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0" /><img src="ipb/style_emoticons/default/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0" />


Nie jest złe, ale co jeśli emotka, czy ogólnie obrazek, mają class, id czy jakieś inne rzeczy, niestety mało uniwersalny

Ale dzięki za chęci winksmiley.jpg
zegarek84
podaj wszystkie kombinacje i co z tych kombinacji chcesz usunąć to zrobię uniwersalne winksmiley.jpg - dla mnie wyrażenia reguarne nie stanowią większego problemu - widziałem Twój temat prawie od początku ale akurat musiałem na dłużej wyjść i dlatego tak puźno to napisaęłm ;/
Zdunek
Już nie trzeba,
ten kod:
$dane=str_replace('style_emoticons/%3C#EMO_DIR#%3E', 'ipb/style_emoticons/default', $dane);
$dane=preg_replace('#emoid=\"[^\"]+"#', "", $dane);
$dane=preg_replace("#<img([^>]+[^/])>#", "<img \\1/>", $dane );
echo $dane;
wystarcza, oraz jest łatwy do edycji i implementacji w inne znaczniki które w ipb są 'dziwnie' przechowywane
zegarek84
w pojedyńczym cudzysłowiu nie musisz ucieczki robić przed podwójnym cudzysłowiem a jednocześnie przed samym = powinien być znak ucieczki (jak widzisz u mnie działa) więc zamiast - jednocześnie znak zapytania sprawai że wyrażenie regularne nie będzie tak bardzo zachłanne winksmiley.jpg:
Kod
$dane=preg_replace('#emoid=\"[^\"]+"#', "", $dane);

powinno wystarczyć:
Kod
$dane=preg_replace('/emoid\="[^"]+?"/', '', $dane);

podobnie przy:
Kod
$dane=preg_replace("#<img([^>]+[^/])>#", "<img \\1/>", $dane );

wystarczy winksmiley.jpg:
Kod
$dane=preg_replace('/<img([^>]+?)>/', '<img\1 />', $dane );

nie chce mi się sprawdzać ;p - ale mimo tych modyfikacji też powinno działać a tam gdzie nie trzeba nie powinno się zbyt mocno definiować wyrażeń regularnych żeby samemu się nie pogubić winksmiley.jpg - jeszcze czasem przydaje się grupowanie ciągu z wyłączeniem zmiennej czyli coś w stylu (?:[^f]) - po prostu ta zmienna nie będzie zapamiętana - czasem jest potrzebna oszczędność gdyż do zmiennych można zapakować bodajrze tylko 9 grup winksmiley.jpg

pozatym zamiast urzywać 2 razy preg_replace mógłbyś urzyć tą funkcję tylko raz gdyż jako parametr ona przyjmuje też tablicę winksmiley.jpg - więc można ją wykożystać do bbcode ^^
ayeo
Witam!

Mam kilka uwag. Gdzie jest tytuł wiadomości? Czemu nie używasz BBcode jak wklejasz kod? Czemu używacie ereg(); zamiast preg(); ?

Pozdrawiam!
Zdunek
Cytat(zegarek84 @ 1.02.2009, 23:10:14 ) *
w pojedyńczym cudzysłowiu nie musisz ucieczki robić przed podwójnym cudzysłowiem a jednocześnie przed samym = powinien być znak ucieczki (jak widzisz u mnie działa) więc zamiast - jednocześnie znak zapytania sprawai że wyrażenie regularne nie będzie tak bardzo zachłanne winksmiley.jpg :
Kod
$dane=preg_replace('#emoid=\"[^\"]+"#', "", $dane);

powinno wystarczyć:
Kod
$dane=preg_replace('/emoid\="[^"]+?"/', '', $dane);

podobnie przy:
Kod
$dane=preg_replace("#<img([^>]+[^/])>#", "<img \\1/>", $dane );

wystarczy winksmiley.jpg :
Kod
$dane=preg_replace('/<img([^>]+?)>/', '<img\1 />', $dane );

nie chce mi się sprawdzać ;p - ale mimo tych modyfikacji też powinno działać a tam gdzie nie trzeba nie powinno się zbyt mocno definiować wyrażeń regularnych żeby samemu się nie pogubić winksmiley.jpg - jeszcze czasem przydaje się grupowanie ciągu z wyłączeniem zmiennej czyli coś w stylu (?:[^f]) - po prostu ta zmienna nie będzie zapamiętana - czasem jest potrzebna oszczędność gdyż do zmiennych można zapakować bodajrze tylko 9 grup winksmiley.jpg

pozatym zamiast urzywać 2 razy preg_replace mógłbyś urzyć tą funkcję tylko raz gdyż jako parametr ona przyjmuje też tablicę winksmiley.jpg - więc można ją wykożystać do bbcode ^^

przy drugim nie do końca działa, jeśli jest / to dodaje następny

a przy pierwszym, jaka jest różnica?, działa tak samo, domyślam się że działa szybciej, ale czemu jest / zamiast #

PS: Znasz może jakiś porządny opis składni wyrażeń regularnych w preg ?

Cytat(ayeo @ 2.02.2009, 01:46:19 ) *
Witam!

Mam kilka uwag. Gdzie jest tytuł wiadomości? Czemu nie używasz BBcode jak wklejasz kod? Czemu używacie ereg(); zamiast preg(); ?

Pozdrawiam!



Głupie pytanie, po co tytuł tematu jak sam tytuł wszystko tłumaczy ?(tak wiem, regulamin)
Odnośnie bbkodu, część na szybko wrzucałem, przepraszam winksmiley.jpg
Na necie jest dobrze i w prosty sposób opisana składnia ereg, niestety z preg nie jest tak dobrze.
zegarek84
jak pisałem nie chciało mi się sprawdzać i tego nie sprawdzam znowu ale to drugie poprawione wystarczy na 99% (bo nie sprawdzam i leniwym ^^):
Kod
$dane=preg_replace('/<img([^>]+?) \/?>/', '<img\1 />', $dane );


# zamiast / - w zasadzie z tym różnicy nie ma ;p - ale szybciej bedzei pojedyńczy cudzysłów jak podwójny ;p - przy pierwszym różnica głównie z dodaniem znaku zapytania co trochu przyśpieszy (poczytaj o zachłanności wyrażeń regularnych i jak dopasowuje do ogułu)

co do wyrażeń regularnych po formacie zginąl mi jeden świetny artykuł, ale te linki co podam nie są złe - może w pierw taka mała kompilacja wiedzy z przykładami (co prawda w javascript - więc nie musisz uczyć się samych tych funkcji - jednak przyjrzyj się jak pracują wyrażenia regularne):
http://www.doman.art.pl/kursjs/kurs/regular.html
następny to o samych wyrażeniach regularnych - dosyc dobry i poczytaj tam głównie o zachłanności wyrażeń regularnych, grupowaniu i wyłączaniu zmiennych z zapamiętanych w grupowaniu:
http://wyrazenia-regularne.pl/
no niestety na tych stronach brakuje o modyfikatorach wyrażeń regularnych ;/ (szkoda, że nie zarchiwizowałem ulubionych bo ten jeden kursik był świetny), dlatego co do modyfikatorów odeśle niestety do manuala ale modyfikatory się żadko używa - najczęściej z nich to te na znaki unikode i na małe litery:
http://php.net.pl/manual/pl/reference.pcre...n.modifiers.php
tu masz przetłumaczone na polski modyfikatory:
http://gajdaw.pl/php/wyrazenia-regularne-p...torial/p19.html


a i jeszcze w tym miejscu jest jeden ciekawy fragment co do dopasowanych wyrażeń regularnych które pasują jeśli poprzednie pasuje lub następne nie pasuje i o komentażach zamiast grupy:
http://codebase.pl/php/15

ogólnie na necie też ładnie opisane co do wyrażeń regularnych ^^
co do Głupiego pytania - podejrzewam, że potrzebne do tagów meta gdyż forum jest dosyć dobrze wypozycjonowane w wyszukiwarce a i pierwsze strony tematów mają przyjazne adresy winksmiley.jpg
ayeo
~Zdunek, jako, że zignorowałeś moją prośbę o poprawienie tytułu temat zamykam. Jeżeli chcesz go otworzyć z powrotem to prześlij poprawiony tytuł któremuś z moderatorów.

Pozdrawiam!
Zdunek
Edit:

'Odnawiam' temat bo znowu mam problem z preg_replace
Mam taki ciąg:
  1. <?php
  2. $dane .= '<!--quoteo(post=1466:date=Mar 11 2009, 06:38 PM:name=Auri11)--><div class='quotetop'>CYTAT(Auri11 @ Mar 11 2009, 06:38 PM) <a href="index.php?act=findpost&amp;pid=1466"><{POST_SNAPBACK}></a></div><div class='quotemain'><!--quotec-->
  3. Jakiś tam cytowany tekst.
  4. <!--QuoteEnd--></div><!--QuoteEEnd--><br />';
  5. ?>

i chcę
wywalić <!--quoteo*--> i to mi się udało
  1. <?php
  2. $dane=preg_replace('#<!--quoteo[^\"]+-->#', "", $dane);
  3. ?>

zamienić <div class=\'quotetop\'*>*</div> na co innego
oraz z <div class=\'quotemain\'*> {dane} </div> wyciągnąć dane

nie chcę gotowca, proszę o wytłumaczenie, albo jakiś porządny link z wyrażeniami regularnymi dla preg_replace, bo zawsze miałem z tym problemy, a kiedyś się trzeba tego nauczyć

Edit: Po długich męczarniach, udało mi się to zrobić, jakby ktoś potrzebował
  1. <?php
  2. $dane=preg_replace('#<!--Quote(.*?)+-->#', "", $dane);
  3.    $dane=preg_replace('#<!--quote(.*?)+-->#', "", $dane);
  4.    $dane=preg_replace('#<div class='quotetop'>(.*?)</div>#', "<span class=\"quote\">".$this->words[$this->lang][quote].":</span>", $dane);
  5.    $dane=preg_replace('#<div class='quotemain'>(.*?)</div>#', "<span class=\"quote_main\">1</span>", $dane);
  6. ?>
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.