2010-04-28 10 views
6

Oto moja sytuacja i rozwiązanie, które wymyśliłem, aby rozwiązać problem. Stworzyłem aplikację, która zawiera TinyMCE, aby umożliwić użytkownikom tworzenie treści HTML do publikacji. Użytkownik może dołączyć obrazy do swoich znaczników i przeciągnąć/zmienić rozmiar tych obrazów wpływających na ostateczne atrybuty Szerokość/Wysokość w znaczniku IMG. To wszystko świetnie, użytkownicy mogą dołączać obrazy i zmieniać ich rozmiar/przenieść do pożądanego wyglądu. Ale jednym dużym problemem jest to, że teraz wysyłam klientowi (potencjalnie) znacznie większy obraz, tylko po to, aby przeglądarka zmieniła rozmiar obrazu na żądane atrybuty szerokości/wysokości. Cała ta przepustowość i stracony czas ładowania ...Regex do GENERATE thumbnails!?!?! (ale to szalone!)

Moje rozwiązanie polega na wstępnym przetworzeniu zawartości znaczników użytkowników, skanowaniu wszystkich znaczników IMG i analizie atrybutów Wysokość/Szerokość/Src. Następnie ustaw każdy tag SRC img'a na żądanie phpThumb, a sparsowana wysokość/szerokość jest przekazywana do URL-a miniaturek. Spowoduje to utworzenie obrazu o zmniejszonym rozmiarze (optymalizacja przepustowości kosztem procesora i buforowania). Co sądzisz o tym rozwiązaniu? Widziałem inne posty, w których ludzie używali mod_rewrite do zrobienia czegoś podobnego, ale chcę wpłynąć na treść strony i nie manipulować żądaniami obrazków, gdy są odbierane. .... Jakieś przemyślenia na temat tego projektu?

Potrzebuję pomocy przy drobnych szczegółach, ponieważ moje umiejętności w zakresie regexu wymagają trochę pracy, ale jestem bardzo skora i obiecuję, że wkrótce będę mógł zapłacić za wiedzę techniczną. Aby ułatwić korzystanie z regex, mogę być pewien pewnych rzeczy. Tylko znaczniki IMG, które wymagają tego przetwarzania, będą miały istniejące atrybuty width = "" height = "" (z podwójnymi cudzysłowami i tekstem o małych rozmiarach, ale przypuszczam, że dopasowanie do wielkości liter nie będzie poprawne, jeśli TinyMCE ulegnie zmianie)

Czyli wyrażenie regularne pasuje tylko do niezbędnych znaczników Img, a może jeszcze trzech wyrażeń regularnych, aby wyodrębnić src, szerokość i wysokość?

Dziękuję wszystkim.

+2

Czy rozważałeś użycie parsera HTML? Czy to nie jest opcja? – pinkgothic

+1

Zgadzam się, wybierając opcję regex, dodajesz znaczącą niepewność do swojego projektu. Może się okazać, że implementacja jest szybsza niż rozwiązanie proceduralne, lub może być znacznie, dużo, dużo wolniejsza (zakładając, że wstrzykujesz problemy, które zostały złapane w kontroli jakości lub przez użytkowników). Co najmniej kodowane rozwiązanie proceduralne jest ograniczone. –

Odpowiedz

3

myślę użyciu regexs tego jest to zły pomysł i chcesz być lepiej parsowania go za coś takiego PHP Simple HTML DOM Parser, można zrobić coś takiego:

// Load HTML from a string 
$html->load($your_posted_content); 

// Find all images 
foreach($html->find('img') as $element) 
     echo $element->src . '<br>'; 
+0

Zaimplementowałem moje rozwiązanie za pomocą prostego parsera DOM HTML, który zasugerowałeś. Działa jak urok :) – CryptoMonkey

+0

Doskonałe wiadomości. Jest to również przydatna technika dla wielu podobnych zadań. –

0

Generalnie RegEx is not good for HTML parsing .. Ale w Twój przypadek może ci się uda, jeśli ograniczysz zakres do bardzo wąskiego zakresu (tzn. wyszukasz tylko atrybuty width=".." i height=".." .. lub coś w tym stylu).

Lepszym rozwiązaniem może być przeniesienie zawartości z TinyMCE asynchronicznie, behing-scenami i przetworzenie jej po stronie serwera za pomocą odpowiedniego parsera HTML/XML, a następnie zaktualizowanie zawartości edytora, kiedy już to zrobi.

+0

I nie zapominajmy o http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 - choćby dlatego, że ten konkretny koń nie może być pokonany martwy *dość*. ;) [Zrzeczenie się: Link jest tylko humorem, nie spodziewaj się wielkiego nowego wglądu ani niczego.] – pinkgothic

+0

i tak .. jest też ten post .. :) –

+0

To było bardzo zabawne :) – CryptoMonkey

1

Spróbuj tego:

(?i)<img(?>\s+(?>src="([^"]*)"|width="([^"]*)"|height="([^"]*)"|\w+="[^"]*"))+

To będzie pasować do każdego znacznika obrazu, a jeśli src, width, a height atrybuty są obecne, ich wartości zostaną zapisane w grupach 1, 2 i 3 odpowiednio . Nie wymaga to jednak żadnego z tych atrybutów, dlatego przed rozpoczęciem przetwarzania należy sprawdzić, czy wszystkie trzy grupy zawierają wartości.

Powiązane problemy