Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php,regexp] wyrażenia regularne - zamiana
Forum PHP.pl > Forum > PHP
Scrooge
Witam!

Potrzebuje wyrażenia regularnego, które przekształciło mi coś takiego:

  1. <table cellpadding="10">
  2. <tr>
  3. <td>jeden</td>
  4. <td>dwa</td>
  5. </tr>
  6. <tr>
  7. <td>trzy</td>
  8. <td>cztery</td>
  9. </tr>


w

  1. <tr>
  2. <td style="padding:10px">jeden</td>
  3. <td style="padding:10px">dwa</td>
  4. </tr>
  5. <tr>
  6. <td style="padding:10px">trzy</td>
  7. <td style="padding:10px">cztery</td>
  8. </tr>


Wiem, że pewnie to będzie preg_replace. Nawet napisałem już jakiś pattern postaci:
"<table(?:.*?)cellpadding="(.*?)"(?:.*?)>(?:\n(?:\s)*(?:.*))*</table>"
i on wyłapuje mi tą potrzebną część czyli ile wynosi padding ale nie wiem jak teraz z tego stworzyć potrzebny kod wynikowy.

Problem bierze się z faktu, że FCKeditor przy tworzeniu tabelek produkuje "cellpading" w tabelach. A to się gryzie z plikiem css gdzie jest zapis *{padding:0;margin:0} a więc zeruje wszystkie paddingi i tylko css-em można je dodać. "cellpadding" html-owy jest ignorowany. Jeśli ktoś zna inny sposób na rozwiązanie tego problemu (żeby w tabelkach tworzonych w FCKedytorze działał cellpading) to był bym wdzięczny za podpowiedź. Najrozsądniej było by po prostu przerobić FCKEditora, żeby tworzył od razu taki kod ale zagłębić się w jego kod to nie lada gratka a nie mam czasu na to teraz smile.gif
nevt
przecież wystarczy że w pliku CSS dopiszesz linijkę:
Kod
td
{ padding: 10px; }

powodzenia
Scrooge
super... tylko, że takich tabelek w fck editorze mogę stworzyć powiedzmy 4. Jedna padding:4, druga 8 trzecia 12 a czwarta 15 i co wtedy questionmark.gif Mogę bawić się w określanie id tabelki i dla niej tworzenie td{} ale to też trzeba by ingerować w FCKEditora, żeby dodawał do tabelki id etc.
nevt
no i dalej uważam, że zrobienie 4 jednolinijkowych stylów w CSS oraz nadanie tym 4 tabelkom różnych id jest najsensowniejszym rozwiązaniem. za to generowanie setek razy kodu HTML, w którym każdy znacznik td ma indywidualnie przypisany atrybut style jest cokolwiek nieoptymalne... skoro ten FCKEditor generuje ci sprzeczny kod , to zmień edytor na nowszy / lepszy... ty chcesz naprawiać skutki generacji kiepskiego kodu, a ja staram się uświadomić ci, że lepiej usunąć przyczynę...
pozdrawiam.
Scrooge
Edytora na nowszy nie zmienię bo ta już jest jego najnowszą wersją. Na lepszy nie zmienię bo ten jest bezpłatny a nie będe za to płacił. Dziękuje za porady natury filozoficznej. Świadomość, że to nie jest najoptymalniejsze rozwiązanie mam nie mniej proszę o rozwiązanie natury praktycznej czyli: "jak to zrobić". A nie "czemu tego nie zrobić" smile.gif


czy nikt nie może mi pomóc naprawdę questionmark.gif
matix
Może wsumie najoptymalniejsze rozwiązanie to to nie jest. Zależy też gdzie i do jakich celów chcesz tego użyć. Jeśli np. do administracji newsami, gdzie będzie max 10 wizyt dziennie przez adminów, to raczej problemów z wydajnościa nie będzie.

  1. <?
  2. $string = '<table cellpadding="10">
  3. <tr>
  4.  <td>jeden</td>
  5.  <td>dwa</td>
  6. </tr>
  7. <tr>
  8.  <td>trzy</td>
  9.  <td>cztery</td>
  10. </tr>
  11. </table>';
  12.  
  13. $string = preg_replace('|<(td)>|', '<td cellspacing="10px">', $string);
  14.  
  15. echo $string;
  16. ?>
AxZx
wystarczy
  1. <?php
  2. str_replace('<td>', '<td style="padding:10px">', $twoj_html);
  3. ?>
Scrooge
chłopaki wszystko fajnie tylko, że ciągle powtarzam... na stronie może być wiele tabelek każda z innym paddingiem to po pierwsze. Po drugie wy w waszym kodzie używacie wprost padding:10px a to trzeba najpierw wyłuskać. Ok mogę to zrobić preg_match ale dalej pozostaje problem zrobienia tego dla każdej tabelki. Innymi słowy potrzebny mi program pod algorytm:

dla każdej tabeli z kod zrob{
znajdz cellpadding="$x";
przypisz <td style="padding:$x"
}

Chciałem to zrobić jednym wyrażeniem regularnym ale widzę, że będzie raczej problem smile.gif Co do optymalności to o tyle się nie martwię o to gdyż w ten sposób będzie tworzonych max 5,6 tabelek więc problemu większego nie ma!
Kicok
  1. <?php
  2.  
  3.  
  4. $text = "dsfs sdfvsd dsfvgds
  5. sdf
  6. <table cellpadding=\"10\">
  7. <tr>
  8. <td>jeden</td>
  9. <td>dwa</td>
  10. </tr>
  11. <tr>
  12. <td>trzy</td>
  13. <td>cztery</td>
  14. </tr>
  15. </table>
  16.  
  17. <b>fd fdg </b> fdg f
  18. <table cellpadding=\"5\">
  19. <tr>
  20. <td>jeden</td>
  21. <td>dwa</td>
  22. </tr>
  23. <tr>
  24. <td>trzy</td>
  25. <td>cztery</td>
  26. </tr>
  27. </table>
  28.  
  29. <table>
  30. <tr>
  31. <td>jeden</td>
  32. <td>dwa</td>
  33. </tr>
  34. <tr>
  35. <td>trzy</td>
  36. <td>cztery</td>
  37. </tr>
  38. </table>
  39.  
  40. dgdfg ";
  41.  
  42.  
  43.  
  44.  
  45. function addStyleAttribute( $matches )
  46. {
  47. $tableCode = "<table{$matches[1]}{$matches[3]}>";
  48. $tableCode .= preg_replace( "/<td([^>]*)>/i", "<td1 style=\"padding:{$matches[2]}px\">", $matches[4] );
  49. $tableCode .= "</table>";
  50.  
  51.  
  52. return $tableCode;
  53. }
  54.  
  55.  
  56. $text = preg_replace_callback( '/<table([^>]+?)cellpadding="([0-9]+)"([^>]*)>(.*?)</table>/si', 'addStyleAttribute', $text );
  57. echo '<pre>' . htmlspecialchars( $text ) . '</pre>';
  58.  
  59. ?>



Powinno działać.
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.