2010-01-17 4 views
10

ho qualche codice con la struttura simile a questochiamando la funzione all'interno questo è preg_replace all'interno di una funzione

  function bbcode($Text) 
      { //$Text = preg_replace("/\[video\](.+?)\[\/video\]/",embed_video($1), $Text); 
    return $Text;} 

    function embed_video($url){ 
if (preg_match("/http:\/\/www.youtube.com\/watch\?v=([0-9a-zA-Z-_]*)(.*)/i", $url, $matches)) { 
    return '<object width="425" height="350">'. 
      '<param name="movie" value="http://www.youtube.com/v/'.$matches[1].'" />'. 
      '<param name="wmode" value="transparent" />'. 
      '<embed src="http://www.youtube.com/v/'.$matches[1].'&autoplay="0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350" />'. 
      '</object>'; 
} 
    return $url; 
    } 

$lolcakes = "[video]http://youtube.com/id/xxxxxxpron[/video]"; 
$lolcakesconverted = bbcode($lolcakes); 

Il problema è che sputa un errore verso di me.

Errore di analisi: errore di sintassi, T_LNUMBER inaspettato, aspettandosi T_VARIABLE o '$'

ha qualche idea su come posso chiamare embed_video all'interno della preg_replace della funzione bbcode?

Grazie!

risposta

30

È possibile utilizzare il modificatore "e" on preg_replace() (vedi Pattern Modifiers)

return preg_replace("/\[video\](.+?)\[\/video\]/e", "embed_video('$1')", $Text); 

che racconta preg_replace() per trattare il secondo parametro come codice PHP.

+0

grazie mille. perfetto – jiexi

+0

cool. Hai risolto il mio problema! Grazie!! – Cris

+17

In realtà, il "/ e" modificatore è disapprovato (come può portare a una vulnerabilità di sicurezza) e si dovrebbe usare [ 'preg_replace_callback'] (http://php.net/manual/en/function.preg-replace-callback. php) invece –

26

provare preg_replace_callback

return preg_replace_callback("/\[video\](.+?)\[\/video\]/", 'embed_video', $Text); 

function embed_video($matches) 
{ 
    return $matches[1] . 'foo';  
} 
+0

forse avrei dovuto essere un po 'più specifico l'embed_video() ha un altro preg_replace interno – jiexi

+0

va bene, si può fare qualsiasi trasformazione necessaria embed_video ... preg_replace_callback chiamerà per eventuali corrispondenze trovate e prendere il risultato – jspcal