Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php,regexp] wyrażenia regularne - zamiana
Scrooge
post
Post #1





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 22.12.2006

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nevt
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


przecież wystarczy że w pliku CSS dopiszesz linijkę:
Kod
td
{ padding: 10px; }

powodzenia
Go to the top of the page
+Quote Post
Scrooge
post
Post #3





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 22.12.2006

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
nevt
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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.

Ten post edytował nevt 12.01.2008, 14:39:02
Go to the top of the page
+Quote Post
Scrooge
post
Post #5





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 22.12.2006

Ostrzeżenie: (0%)
-----


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ć" (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


czy nikt nie może mi pomóc naprawdę (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
matix
post
Post #6





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
AxZx
post
Post #7





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


wystarczy
  1. <?php
  2. str_replace('<td>', '<td style="padding:10px">', $twoj_html);
  3. ?>
Go to the top of the page
+Quote Post
Scrooge
post
Post #8





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 22.12.2006

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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!
Go to the top of the page
+Quote Post
Kicok
post
Post #9





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


  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ć.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.12.2025 - 14:42