【问题标题】:Replace Youtube links in text with a specific embed code用特定的嵌入代码替换文本中的 Youtube 链接
【发布时间】:2011-06-27 20:17:46
【问题描述】:

这是我的问题。我的表单中有一个文本区域,用户可以在其中提交 youtube 视频 links 。我需要解析文本并将 youtube 链接替换为它们的嵌入等效项。一个例子:

文本中的初始 URL:“blah blah http://www.youtube.com/watch?v=PLs5HN7FS0w blah blah” 存储到 mysql db 之前的最终文本:“blah blah [youtube=http://www.youtube.com/watch?v=PLs5HN7FS0w] blah blah”

知道如何使用 php 对文本框中的每个链接执行此操作吗?

【问题讨论】:

    标签: php jquery mysql html youtube


    【解决方案1】:

    我会选择稍微复杂一点的正则表达式,这样会更安全一些,并删除所有你并不真正需要的额外 YT 参数(用户会粘贴它们,你可以打赌):

    $url = 'blabla http://www.youtube.com/watch?v=I6CyoYSlL-M&feature=rec-LGOUT-exp_stronger_r2-2r-26-HM aaaa bbb ccc';
    echo preg_replace('|http://www\.youtube\.com/watch\?.*\bv=([^&]+)[^\s]*|', '[youtube=http://www.youtube.com/watch?v=$1]', $url);
    

    此外,这个 BBcode 不应该真的需要 URL 的这个“http://www.youtube...”部分,它总是一样的?!

    【讨论】:

      【解决方案2】:

      我有点无聊,想出了一个可笑的笨重,虽然相对简单和实用的 jQuery 方法:

      $('form').submit(
      
      function() {
          var text = $('#text').val().split(' ');
          for (i = 0; i < text.length; i++) {
              var test = text[i].indexOf('http://www.youtube.com/watch');
              if (test != -1) {
                  text[i] = '[youtube=' + text[i] + ']';
              }
          }
          text = text.join(' ').trim();
          $('#text').val(text);
          return false;
      });
      

      JS Fiddle demo.


      编辑为函数添加必要的健全性检查:

      $('form').submit(

      function() {
          var text = $('#text').val().split(' ');
          for (i = 0; i < text.length; i++) {
              var test = text[i].indexOf('http://www.youtube.com/watch');
              var check = text[i].indexOf('[youtube=');
              if (test != -1 && check == -1) {
                  text[i] = '[youtube=' + text[i] + ']';
              }
          }
          text = text.join(' ').trim();
          $('#text').val(text);
          return false;
      });
      

      JS Fiddle of sanity-checking demo.

      基本上,在第一个函数中,可以简单地继续重新提交表单并在前面加上“[youtube=”并附加一个结束“]”。后一种方法使我摆脱了一些愚蠢。当然,我可以检查“test”的indexOf() 值是否等于0,所以它位于字符串的开头。如果我重新审视这个,我可能会这样做。


      已编辑,因为有时候,我就是不能让事情继续……

      $('form').submit(
      
      function() {
          var text = $('#text').val().split(' ');
          for (i = 0; i < text.length; i++) {
              var test = text[i].indexOf('http://www.youtube.com/watch');
              if (test === 0) {
                  text[i] = '[youtube=' + text[i] + ']';
              }
          }
          text = text.join(' ').trim();
          $('#text').val(text);
          return false;
      });
      

      Updated JS Fiddle demo.


      Edited (再次)因为我不能让事情保持原样,并且因为我(在 cmets 中)认为 jQuery 示例应该在 php 中可行(或多或少直接)。所以这里是:
      $text = $_POST['text']; // from the textarea of name="text"
      
      $text = explode(" ",$text);
      for ($i=0; $i < count($text); $i++) {
          if (stripos($text[$i], 'http://www.youtube.com/watch') === 0) {
              $text[$i] = '[youtube=' . $text[$i] . ']';
          }
      }
      $text = implode(" ",$text);
      

      我不知道有什么地方可以公开且安全地主持 php 演示,所以我无法演示这个,但我认为它应该 工作。尽管使用foreach() 可能比for() 循环更容易。

      【讨论】:

      • 这很好,但是如果我使用jquery,用户可以再次修改嵌入代码,最好使用php。但是,我将这段代码存储起来以备后用,可能会派上用场:)
      • 嗯,可能。并且总是有必要在存储之前在服务器端验证用户的最终提交,或者使用...无论如何,很高兴能提供帮助! :)
      • 哦,@the_archer,值得注意(作为附录)我选择这种方法的唯一原因是我对正则表达式的强烈不喜欢/不信任(更不用说对同样的某种程度的恐惧) .想不出有什么理由不能直接转php,基本的方法肯定都有。
      • 我当然也讨厌正则表达式。 :P
      • @the_archer,发布了一个 php、服务器端、非正则表达式解决方案! ...现在我想我会暂时搁置这个问题... =D
      【解决方案3】:

      使用正则表达式:

      $target = 'blah blah http://www.youtube.com/watch?v=PLs5HN7FS0w blah blah';
      $target = preg_replace('/(http:\/\/www\.youtube[^ ]*)/', '[youtube=$1]', $target);
      

      这匹配以http://www.youtube 开头且不包含空格的所有内容,并将其捕获到$1 中。然后它将匹配的部分替换为[youtube=$1],其中 $1 是 URL

      【讨论】:

      • 即使在初始文本中有多个链接,这是否有效?
      猜你喜欢
      • 2012-07-22
      • 2015-02-12
      • 2012-01-02
      • 2011-03-15
      • 2011-06-10
      • 2012-02-26
      • 1970-01-01
      • 2014-01-21
      • 2017-09-14
      相关资源
      最近更新 更多