bassebhuMedlem sedan nov. 20014 028 inlägg
Hej!
Hur kan jag fixa denna kod så att det börjar att fungera igen? :)
Jag får följande fel efter php-uppgradering:
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in
function video($str,$width=560,$height=315,$img='')
{
$rules = array('/\[video\](.*?)\[\/video\]/e' => "videoplayer('$width','$height','$img','$1')"
);
foreach ($rules as $link => $player)
$str = preg_replace($link, $player, $str);
return $str;
}
prplxrMedlem sedan juni 2012557 inlägg
Kika i dokumentationen: http://php.net/manual/en/function.preg-replace-callback.php
Där finns all info du behöver. :-)
bassebhuMedlem sedan nov. 20014 028 inlägg
Har försökt, men kan inte få det att funka :(
Jag får inte in $player i ekvationen. Tips?
drewMedlem sedan mars 2007748 inlägg
Din array innehåller bara en rad så du borde skippa den och använda en sträng istället.
$str = preg_replace_callback('/\[video\](.*?)\[\/video\]/', function ($ary) { return(videoplayer($width, $height, $img, $ary[1])); }, $str);
Kanske liknar något.
bassebhuMedlem sedan nov. 20014 028 inlägg
Det är fler grejer som inte finns med i mitt exempel ovan så det måste vara en array tyvärr. Jag testade det här, men det verkar inte funka:
$str = preg_replace_callback($link, function ($ary) { global $player; return($player); }, $str);
Idéer? Tack!
bassebhuMedlem sedan nov. 20014 028 inlägg
Vad är det som ersätter "e" i den nya funktionen?
drewMedlem sedan mars 2007748 inlägg
preg_replace_callback() ersätter 'e'
bassebhuMedlem sedan nov. 20014 028 inlägg
Hm, jag försöker men är helt stuck. Vet inte hur jag får in $player från arrayen så att den kör php-koden. Tips? :D
metalboyMedlem sedan jan. 2005870 inlägg
Jag tror inte att det finns ett "bra" sätt att göra det på (det enda jag kan komma på är att använda eval, och "eval is evil" :)). Visa hur hela funktionen video ser ut, så kan man kanske hitta ett annat sätt att lösa det på.
bassebhuMedlem sedan nov. 20014 028 inlägg
Visst! Tack!
function video($str,$width=560,$height=315,$img='')
{
$rules = array(
'~
\[video\]https?:// # Required scheme. Either http or https.
(?:[0-9A-Z-]+\.)? # Optional subdomain.
(?: # Group host alternatives.
vimeo\.com/ # Either youtu.be,
|
youtu\.be/ # Either youtu.be,
| youtube\.com # or youtube.com followed by
\S* # Allow anything up to VIDEO_ID,
[^\w\-\s] # but char before ID is non-ID char.
) # End host alternatives.
([\w\-]{10,12}) # $1: VIDEO_ID is exactly 11 chars.
(?=[^\w\-]|$) # Assert next char is non-ID or EOS.
(?! # Assert URL is not pre-linked.
[?=&+%\w]* # Allow URL (query) remainder.
(?: # Group pre-linked alternatives.
[\'"][^<>]*> # Either inside a start tag,
| </a> # or inside <a> element text contents.
) # End recognized pre-linked alts.
) # End negative lookahead assertion.
[?=&+%\w\.]*\[/video\] # Consume any URL (query) remainder.
~ix' => '<iframe width="' . $width . '" height="' . $height . '" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>',
'#\[video\]https?://(www\.)?vimeo\.com/([^ ?\n/]+)((\?|/).*?(\n|\s))?\[/video\]#i' => '<iframe src="//player.vimeo.com/video/$2" width="' . $width . '" height="' . $height . '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>',
'/\[video\](.*?)\[\/video\]/e' => "videoplayer('$width','$height','$img','$1')"
);
foreach ($rules as $link => $player)
$str = preg_replace($link, $player, $str);
return $str;
}
metalboyMedlem sedan jan. 2005870 inlägg
Du skulle kunna bryta ut den regeln och behandla den separat.
function video($str,$width=560,$height=315,$img='')
{
$rules = array(
'~
\[video\]https?:// # Required scheme. Either http or https.
(?:[0-9A-Z-]+\.)? # Optional subdomain.
(?: # Group host alternatives.
vimeo\.com/ # Either youtu.be,
|
youtu\.be/ # Either youtu.be,
| youtube\.com # or youtube.com followed by
\S* # Allow anything up to VIDEO_ID,
[^\w\-\s] # but char before ID is non-ID char.
) # End host alternatives.
([\w\-]{10,12}) # $1: VIDEO_ID is exactly 11 chars.
(?=[^\w\-]|$) # Assert next char is non-ID or EOS.
(?! # Assert URL is not pre-linked.
[?=&+%\w]* # Allow URL (query) remainder.
(?: # Group pre-linked alternatives.
[\'"][^<>]*> # Either inside a start tag,
| </a> # or inside <a> element text contents.
) # End recognized pre-linked alts.
) # End negative lookahead assertion.
[?=&+%\w\.]*\[/video\] # Consume any URL (query) remainder.
~ix' => '<iframe width="' . $width . '" height="' . $height . '" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>',
'#\[video\]https?://(www\.)?vimeo\.com/([^ ?\n/]+)((\?|/).*?(\n|\s))?\[/video\]#i' => '<iframe src="//player.vimeo.com/video/$2" width="' . $width . '" height="' . $height . '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'
);
$videoplayerRule = '/\[video\](.*?)\[\/video\]/';
foreach ($rules as $link => $player) {
$str = preg_replace($link, $player, $str);
}
$str = preg_replace_callback($videoplayerRule, function($matches) use ($width, $height, $img) {
return videoplayer($width, $height, $img, $matches[1]);
}, $str);
return $str;
}
bassebhuMedlem sedan nov. 20014 028 inlägg
Snyggt, funkar! Tack! :D
Jag fick ett T_VARIABLE-fel först, men uppgraderade PHP till 5.3 och då funkade det.