Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja poprawiające znaczniki <img> (Wyrażenia regularne)
Forum PHP.pl > Forum > PHP
ladovnik
Witam. Zrobiłem funkcję, która poprawia znaczniki <img> w kodzie strony, mianowicie dodaje do nich atrybut alt (Takie są standardy W3C). Problem w tym, że do tych które mają już alt też dodaje... nie wiem jak zrobić, aby znaczniki z alt były pomijane... tzn. wiem, trzeba użyć negacji, ale z negacją zawsze miałem problemy... Pomoże mi ktoś?

Kod funkcji:
  1. <?php
  2. function FixImgTags($str)
  3. {
  4.    $str=preg_replace("#<img(.*?)>#si","<img$1 alt=\"Image\">",$str);
  5.    
  6.    return $str;
  7. }
  8. ?>


Pozdrawiam,
ladovnik
Wave
Ja bym wywalal wszystkie alty pregiem i wrzucal na nowo, bo regexa do tego nie wiem czy ulozysz (nie wiem czy przy negacji wtecznej możesz stosować nieokreślone zbiory).
Crozin
Możesz wskazać mi w dokumentacji W3C fragment, który by informował o tym, że należy zrobić coś takiego jak Ty? To co robisz nie ma najmniejszego związku z W3C.

Co do problemu samego w sobie: preg_replace_callback" title="Zobacz w manualu PHP" target="_manual i przed zmianą sprawdzasz czy aby przypadkiem nie ma już alta.
zegarek84
Kod
$dane='<img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" alt="smile.gif" border="0"/><img src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" border="0" />';
$dane=preg_replace(array('/ alt\=".*?"/si','/<img([^>]*?) ?\/?>/si'),array('','<img alt="Image"\1 />'),$dane);
echo $dane;

daje:
Kod
<img alt="Image" src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" border="0" /><img alt="Image" src="style_emoticons/%3C#EMO_DIR#%3E/smile.gif" style="vertical-align: middle;" border="0" />
Smoker
w html'u nie jest błędem użycie img bez alt'a ! Do najnowszej części html'a czyli teraz chyba 4.01 bynajmniej wiem ze nie jest smile.gif Czyli spokojnie mozesz nie miec alt'a. Chyba ze strona opiera się na xhtml'u wtedy niezaleznie od wersji xhtml'a z ktorej kozystasz brak alt'a jest błędem. czyli tak w skrócie:

HTML - nie musisz mieć alt'a
xHTML - musisz mieć alt'a

A co do podmiany to mozesz sprobowac cos z if'em typu
Kod
if(nie ma alt'a){
wstaw go;
}
else{
nic nie rób
}


Ale to tylko taka mała propozycja toku mojego toku myślenia. Sam dopiero zaczynam z php wiec jeszcze Ci tego nie napisze w gotowym skrypcie ale mam nadzieje ze to pomoze smile.gif
Foxx
Upraszczając nieco:
  1. <?php
  2. $str = '<img src="costam">';
  3.  
  4. if(preg_match('/alt/', $str) == 0){
  5.   echo preg_replace("#<img(.*?)>#si","<img$1 alt=\"Image\">",$str);
  6. } else {
  7.   echo $str;
  8. }
  9. ?>


Aby obsłużyć także przypadek pustego tagu alt (alt="") można zrobić tak:

  1. <?php
  2. $str = '<img src="costam" alt="">';
  3.  
  4. if(preg_match('/alt/', $str) == 0){
  5.    echo preg_replace("#<img(.*?)>#si","<img$1 alt=\"Image\">",$str);
  6. } elseif(preg_match('/alt=""/', $str) == 1){
  7.    echo preg_replace('/alt=""/', 'alt="Image2"', $str);
  8. } else {
  9.    echo $str;
  10. }
  11. ?>
ladovnik
Ohoho, ile postów smile.gif A więc po kolei:
Wave - Jeśli chodzi o Twój pierwszy sposób z wywaleniem wszystkich altów i dodaniem ich na nowo też tak myślałem, ale jeżeli wcześniej były nadane konkretne alty np. alt="Kliknij aby coś tam" to raczej nie wskazane jest je usuwać.
Crozin - Wave już ci odpisał. Ja używam xHTML 4.01 smile.gif
Foxx przeanalizuję Twój przykład i niedługo Wam odpiszę, czy jest to rozwiązanie problemu (obecnie niestety muszę wyłączyć komputer...).

EDYCJA:
Niestety, Twoje rozwiązanie Foxx było by dobre, ale tylko dla jednego tagu IMG, ponieważ jeśli zmienna $str będzie zawierać:
  1. <?php
  2. $str="<html>
  3. <head>
  4. <title>Test</title>
  5. </head>
  6. <body>
  7. <p>Aby to zrobić, należy wcisnąć klawisz alt</p>
  8. <img src=\"obraz.png\">
  9. <img src=\"obraz.png\" width=\"8\" height=9>
  10. <img src=\"obraz.png\" width=\"666\" height=\"986\" border=0>
  11. <img src=\"obraz.png\" alt=\"tekst\">
  12. <img src=\"obraz.png\" alt=\"tekst\" border=0>
  13. </body>
  14. </html>";
  15. ?>

Wtedy jeśli gdziekolwiek znajdzie się słowo alt nawet nie w tagu img to on nie zamieni nic, w całym źródle.

Aby Twoje rozwiązanie było dobre dla takiej zmiennej należało by ją podzielić w tablicy tak, aby każdy tag img był w osobnym rekordzie a to co nie jest tagiem img też w osobnych rekordach...

EDYCJA 2:
Problem rozwiązałem przy pomocy explode, preg_match i preg_replace.

Pozdrawiam,
ladovnik
Crozin
Cytat
Crozin - Wave już ci odpisał. Ja używam xHTML 4.01
Widzę, że nikt nie zrozumiał smile.gif
<img ... alt="image" /> nie manic wspólnego z tym co mówi W3C. W alt ma się znaleźć tekst alternatywny, opisujący obrazek jego treści lub ew. działania. Wstawienie tam "image" jest kompletnie pozbawione sensu i IMHO pewnie słży jedynie This page is VALID ... document chociaż tak naprawdę nie będzie to "valid".
W dodatku taki alt, wprowadza więcej złego niż dobrego.

Co do tematu - jak napisałem pobierasz wyr.reg. wszystkie <img> i w callbacku sprawdzasz czy alt już jest.
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.