Problem z tagiem video na stronie

0

Witam, mam problem na swojej stronie z tagiem video.
Korzystając na stronie z BBCode użycie tagu video jest możliwe tylko raz. Użycie wielokrotne powoduje wyłącznie wyświetlenie ostatniego użycia, a wszystko co było użyte przed tagiem znika.

Kod odpowiedzialny za tag to:

$s = preg_replace("/\[video=[^\s'\"<>]*youtube.com.*v=([^\s'\"<>]+)\]/ims", "<object width=\"500\" height=\"410\"><param name=\"movie\" value=\"https://www.youtube.com/v/\\1\"></param><embed src=\"https://www.youtube.com/v/\\1\" type=\"application/x-shockwave-flash\" width=\"500\" height=\"410\"></embed></object>", $s);
// Google Vids
$s = preg_replace("/\[video=[^\s'\"<>]*video.google.com.*docid=(-?[0-9]+).*\]/ims", "<embed style=\"width:500px; height:410px;\" id=\"VideoPlayback\" align=\"middle\" type=\"application/x-shockwave-flash\" src=\"https://video.google.com/googleplayer.swf?docId=\\1\" allowScriptAccess=\"sameDomain\" quality=\"best\" bgcolor=\"#ffffff\" scale=\"noScale\" wmode=\"window\" salign=\"TL\"  FlashVars=\"playerMode=embedded\"> </embed>", $s);

Czy ktoś pomoże to poprawić ?

1

Pokaż kod gdzie to wyświetlasz. Sprawdź czy nie nadpisujesz sobie tej zmiennej $s.

0

Zamieszczam w załączniku plik z tym kodem
https://megawrzuta.pl/download/48d3bc565606d512ef2493cc66367f58.html

1

Mogłeś wrzucić po prostu samą funkcję format_comment skoro i tak ona nie jest w tym pliku wywoływana. Spróbuj wyciąć flagę "s" z tego regexa:
/\[video=[^\s'\"<>]*youtube.com.*v=([^\s'\"<>]+)\]/im
I zobacz czy Ci zadziała jak chcesz. Przykład: test regex

0
>>         / YouTube Vids
>>         $s = preg_replace("/\[video=[^'\"<>]*youtube.com.*v=([^'\"<>]+)\]/ims", "<object width=\"500\" height=\"410\"><param name=\"movie\" value=\"https://www.youtube.com/v/\\1\"></param><embed src=\"https://www.youtube.com/v/\\1\" type=\"application/x-shockwave-flash\" width=\"500\" height=\"410\"></embed></object>", $s);


Strona się nie wysypuje ale sytuacja bez zmian, a tester generuje błędy.

1

Miałem na myśli flagę "s" czyli to co jest na końcu wzorca. Zamiast /ims daj tylko /im. W poprzednim poście masz cały wzorzec bez tej flagi.

0

Bardzo dziękuję, działa :)

Mam kolejny problem z tym nieszczęsnym tagiem. Tym razem chodzi o skróconą wersję linków z YT - https://youtu.be.
Próbowałem na bazie działającego, poprzedniego kodu dodać fragment odpowiedzialny za osadzanie filmików na forum w tagu [video]. Prawdopodobnie błąd leży w wyrażeniu regularnym, mimo, że to było sprawdzane w testerze. Nie ma błędu strony, ale nic się nie wyświetla. RegExa przerabiałem na różne sposoby - bez rezultatu. Proszę o pomoc i zgóry dziękuję.

// YouTu.be Vids
$s = preg_replace("/[video=[^\s'\"<>]youtu.be.([^\s'\"<>]+)]/im", "<object width=\"500\" height=\"410\"><param name=\"movie\" value=\"https://youtu.be\1\"></param><embed src=\"https://youtu.be\1\" type=\"application/x-shockwave-flash\" width=\"500\" height=\"410\"></embed></object>", $s);
0

Nie jestem pewien, ale chyba w linku generowanym nie masz ukośnika: podejrzyj sobie jak generuje się ten link.
No i ten wzorzec też bym trochę zmienił.
Zobacz sobie coś takiego

$s = preg_replace("/\[video=[^\s'\"<>]*youtu.be\/([^\s'\"<>]+)\[\/video]/im", "<object width=\"500\" height=\"410\"><param name=\"movie\" value=\"https://youtu.be/\1/"></param><embed src=\"https://youtu.be/\1\" type=\"application/x-shockwave-flash\" width=\"500\" height=\"410\"></embed></object>", $s);
0

Niestety ten kod również nie działa, wywaliło błąd musiałem zedytować

value=\"https://youtu.be/\1/">

na

value=\"https://youtu.be/\1\">

Czyli:

// YouTu.be Vids
$s = preg_replace("/\[video=[^\s'\"<>]*youtu.be\/([^\s'\"<>]+)\[\/video]/im", "<object width=\"500\" height=\"410\"><param name=\"movie\" value=\"https://youtu.be/\1\"></param><embed src=\"https://youtu.be/\1\" type=\"application/x-shockwave-flash\" width=\"500\" height=\"410\"></embed></object>", $s);

Ale również nie działa

0

Na jakim etapie nie działa? Wzorzec z regex źle znajduje id filmu? Czy źle generuje się zastępczy link w obiekcie. Podglądałeś w konsoli przeglądarki?

0

Kod, który wysłałeś nie jest w ogóle parsowany. W poście na forum wygląda tak:

[video=https://youtu.be/S5TG0aXTqps]. 

W konsoli nie widnieje jako obiekt.

Najbliższy działania jest ten kod:

$s = preg_replace("/\[video=[^\s'\"<>]*youtu.be.*([^\s'\"<>]+)\]/im", "<object width=\"500\" height=\"410\"><param name=\"movie\" value=\"https://youtu.be/\\1\"></param><embed src=\"https://youtu.be/\\1\" type=\"application/x-shockwave-flash\" width=\"500\" height=\"410\"></embed></object>", $s);

Post na forum jest pusty, a w konsoli widać:

<param name="movie" value="https://youtu.be//k
<embed src="https://youtu.be//k" type="application/x-shockwave-flash" width="500" height="410">

Zmieniałem regex na goły w+ i usunąłem jeden slash, ale i tak zaciąga w value i src tylko pierwszy znak alfanumeryczny:

<param name="movie" value="https://youtu.be/s">
<embed src="https://youtu.be/s" type="application/x-shockwave-flash" width="500" height="410">

Linki skrócone z YT wyglądają tak:

https://youtu.be/eFp0yxdThF8
  • to jest link odtwarzający film od początku
https://youtu.be/eFp0yxdThF8?t=40
  • to jest link odtwarzający film od danego momentu

Konsola nie zwraca żadnego błędu.

0

Żeby już nie było problemów jak będziesz dodawał Vimeo czy inne serwisy spróbuję Ci to wytłumaczyć:

$s = ' abd [video=640,360]https://youtu.be/eFp0yxdThF8[/video]';
$z= preg_replace("/\[video=[^\s'\"<>]*youtu.be\/([^\s'\"<>]+)\[\/video]/im", '${1}', $s);
//outup:
//abd eFp0yxdThF8 // czyli oryginalny pierwszy tekst +  znaleziona grupa nr 1
// w tym wypadku na podstawie wzorca wycinamy końcówkę URLa

Zapomniałem o tym, że grupę nr 1 trzeba inaczej escapować jeśli jest obok \ Dokumentacja Twoim przyjacielem jest: https://www.php.net/manual/en/function.preg-replace.php i wyraźnie w niej opisane : since it does not know whether you want the \1 backreference followed by a literal 1, or the \11 backreference followed by nothing. In this case the solution is to use ${1}1
Tutaj widzisz https://regex101.com/r/NwVwEv/1 że znaleziona według wzorca grupa 1 to końcówka URLa czyli ID filmu: eFp0yxdThF8
Mając to ID możesz sobie już sklejać jak chcesz nowy obiekt według potrzeb.
Na tej podstawie stworzenie nowego obiektu pozostawiam Tobie.
P.S. Nie wiem ale chyba teraz raczej zalecany w ogóle jest tag <video> zamiast <object>

0

Witam,
Zapewne są nowsze metody obsadzenia tego - już mi sugerowano iframe, lecz ten skrypt jest bardzo stary i wszelkie unowocześnienia przyniosą zapewne więcej problemów niż pożytku. Sam na pewno nie byłbym w stanie tego ogarnąć, a na płatną usługę mnie nie stać. Zależy mi na poprawieniu tego tagu i nic więcej nie ruszam.
Kod, który wysłałeś położył stronę. To co udało mi się osiągnąć, w dużej mierze dzięki Twojej pomocy, to zmodyfikowanie kodu na ten:

$s = preg_replace("/\[video=[^\s'\"<>]*youtu.be\/([^\s'\"<>]+)\]/im", "<object width=\"500\" height=\"410\"><param name=\"movie\" value=\"https://youtu.be/\\1\"></param><embed src=\"https://youtu.be/\\1\" type=\"application/x-shockwave-flash\" width=\"500\" height=\"410\"></embed></object>", $s);

Efekt - post jest pusty, ale w konsoli widać (testowane na innym filmiku):

<object width="500" height="410"><param name="movie" value="https://youtu.be/F3li1NxJF1A"><embed src="https://youtu.be/F3li1NxJF1A" type="application/x-shockwave-flash" width="500" height="410"></object>

Oczywiście nie mam pojęcia czemu nic nie wyświetla...
Masz jakiś pomysł?

Dziękuję i pozdrawiam.

0

Kod który załączyłem w ostatnim poście miał pokazać jak to działa. W regex we wzorcu jak dasz część wyrażenia w nawiasach to jest grupa. Grupy numerowane są od 1. W preg_replace możesz potem użyć jej ponownie. W kodzie wskazałem, że ze względu na mnóstwo ukośników musisz użyć ${1} zamiast wywołania \1.
Przykład napisany z palca pokazujący jak to działa:

$string = 'ala ma kota';
$result = preg_replace("/(ala)*(ma)*(kota)/", '${3}.${2}.${1}', $string);
echo $result;
//powinno pokazać kotamaala

Wzorzec napisałem Ci gotowy:
/\[video=[^\s'\"<>]*youtu.be\/([^\s'\"<>]+)\[\/video]/im
Jak wejdzie na stronę z testami wyrażeń jaką Ci podałem to zobaczysz po prawej stronie, że końcówka urla podświetla się na zielono jako grupa1
https://regex101.com/r/NwVwEv/1
Mając to wszystko musisz tylko złączyć string tego tagu object z wywołaniem otrzymanej końcówki urla przez ${1}

0

Udało się, prawidłowy kod do poprawnego wyświetlania to:

// YouTu.be Vids
$s = preg_replace("/\[video=[^\s'\"<>]*youtu.be\/([^\s'\"<>]+)\]/im", "<iframe width=\"420\" height=\"315\" src=\"//www.youtube.com/embed/$1\" allowfullscreen></iframe>", $s);

Chcę zamienić również standardową wersję linków z YT na iframe, zrobiłem to tak:

$s = preg_replace("/\[video=[^\s'\"<>]*youtube.com.*v=([^\s'\"<>]+)\]/im", "<iframe width=\"420\" height=\"315\" src=\"//www.youtube.com/embed/$1\" allowfullscreen></iframe>", $s);

Lecz niestety zamiast filmiku na stronie wywala komunikat: Zablokowane przez politykę X-Frame -Options.

0

Gratuluję.
Iframe odpuść bo dla YouTube nie zadziała ze względów bezpieczeństwa.

0

Możesz centrować jak każdy inny element. Zrób sobie jakąś klasę i dodawaj tylko klasę.
https://www.w3.org/Style/Examples/007/center.pl.html#vertical

1 użytkowników online, w tym zalogowanych: 0, gości: 1