解析文本中的 bbcode youtube 标签并替换为包含视频 ID 的 html
我正在构建一个应该解析 bbcode 标签的博客,如下所示:
输入:
输出:
<object width="400" height="245">
<param name="movie" value="http://www.youtube- nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0"></param>
<param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>
<embed src="http://www.youtube-nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="245"></embed>
</object>
到目前为止,我的函数非常简单,因为我陷入了最简单的部分! 现在,我有一个主流程函数,它调用不同的流程函数。 在本例中,其中之一是 processYouTubeVideos()。 所以我这样称呼它:
$str = eregi_replace('\<youtube=([^>]*)\>', processYouTubeVideos("\\1"), $str);
processYouTubeVideos() 完美地从 youtube 标签内部接收 URL,但由于某种原因,当使用explode() (或 split)时,永远找不到分隔符。 即使使用“u”或“tube”等测试值......
function processYouTubeVideos ($str) {
$params = explode("?", $str);
$params = explode("&", $params[1]);
return $params[0];
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
之前的两个答案现在都已被彻底弃用。
现代技术是使用
preg_replace_callback()
,然后解析 url 并隔离查询字符串的目标部分。 我将演示如何在 html 模板字符串中使用sprintf()
和占位符。该模式本身不会花费很大的努力来验证 bbcode 标签,因此如果您需要强大的验证,则该模式将需要细化。
代码:(演示)
输出:
Both of the earlier answers are now well and truly deprecated.
The modern technique is to use
preg_replace_callback()
, then parse the url and isolate the targeted portion of the query string. I'll demonstrate usingsprintf()
with placeholders in the html template string.The pattern itself doesn't go to any great effort to validate the bbcode tag, so if you need strong validation, the pattern will need refinement.
Code: (Demo)
Output:
processYouTubeVideos("\1") 函数在 eregi_replace 之前运行。
我认为以下内容符合您的意图:
它执行替换,然后将结果值发送到 processYouTubeVideos。
The processYouTubeVideos("\1") function is being run before the eregi_replace.
The following does what I believe you intend:
It performs the replace, and then sends the resulting value to processYouTubeVideos.
尝试:
您尝试运行的代码将不起作用,因为将在目标模式而不是输出上调用输出字符串上的函数。 这意味着您将按字面意思发送“\1”到该函数。 将
var_dump($str);
添加到函数的开头,然后尝试再次运行代码,您会清楚地看到这一点。preg_replace 有一个特殊的标志“e”,您可以在每次替换时使用它来执行函数制成。 其工作原理是在标记位置 ($1) 插入子模式,然后在代码上运行
eval()
或create_function()
之类的代码来执行它并检索结果。 然后将其发送回preg_replace()
并进行实际的替换。Try:
The code that you're attempting to run won't work, because the function on the output string will be called on the target pattern rather than the output. That means that you're sending "\1" literarly to the function. Add
var_dump($str);
to the beginning of the function and try running your code again, and you'll see this clearly.preg_replace has a special flag "e" that you can use to execute a function for each time a replacement is made. This works by inserting the subpattern at the marker position ($1) and then running something like
eval()
orcreate_function()
on the code to execute it and retrieve the result. This then sent back topreg_replace()
and the actual replacement is made.