bassebhu Medlem sedan nov. 2001 6 480 inlägg Frågan 4 feb. 2015 04:08 #1 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;
}
prplxr Medlem sedan juni 2012 581 inlägg Kika i dokumentationen: http://php.net/manual/en/function.preg-replace-callback.php
Där finns all info du behöver. :-)
bassebhu Medlem sedan nov. 2001 6 480 inlägg Har försökt, men kan inte få det att funka :(
Jag får inte in $player i ekvationen. Tips?
drew Medlem sedan mars 2007 845 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.
bassebhu Medlem sedan nov. 2001 6 480 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!
bassebhu Medlem sedan nov. 2001 6 480 inlägg Vad är det som ersätter "e" i den nya funktionen?
drew Medlem sedan mars 2007 845 inlägg preg_replace_callback() ersätter 'e'
bassebhu Medlem sedan nov. 2001 6 480 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
M metalboy Medlem sedan jan. 2005 953 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å.
bassebhu Medlem sedan nov. 2001 6 480 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;
}
M metalboy Medlem sedan jan. 2005 953 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;
}
bassebhu Medlem sedan nov. 2001 6 480 inlägg Snyggt, funkar! Tack! :D
Jag fick ett T_VARIABLE-fel först, men uppgraderade PHP till 5.3 och då funkade det.