【问题标题】:youtube regex swallows remaining textyoutube 正则表达式吞下剩余的文本
【发布时间】:2011-11-20 14:30:33
【问题描述】:

我正在对一段文本执行 preg_match_allstr_replace 以获取 YouTube 网址并将其替换为正确的嵌入代码。

假设我有以下文本块:

"bla bla bla bla <-youtube-url-> last few words"

一切正常 - youtube-url 已替换为嵌入代码等。但是,运行 str_replace 后,“最后几句话”从最终输出中消失。我怀疑正则表达式正在吞噬 url 之后的所有内容......这就是我用来匹配和提取 YouTube ID 的内容:

%(?:youtube\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i

任何帮助将不胜感激!

更新:

我刚刚发现只有当 youtube url 有任何尾随参数时才会出现问题。以下输入吞下了最后几个单词

'www.youtube.com/watch?v=XXXXXXXXX&parameter=data last few words'

但是如果输入是这样的:

'www.youtube.com/watch?v=XXXXXXXXX last few words'

它工作正常。任何人都可以帮助对正则表达式进行必要的调整吗?

【问题讨论】:

  • 你能发布一个包含视频链接和周围 html 的 HTML 的小片段吗?
  • 这有什么关系?要解析的文本块是来自文本区域的用户输入。
  • 好吧,“文本块”根本不是文本区域或用户输入,这一点并不明显。

标签: php regex youtube preg-match-all str-replace


【解决方案1】:

我通常分解复杂的交替来找出发生了什么。
看来您可能对上一个学期[^"&amp;?/ ]{11} 感到困惑,但不确定
你想做什么。 (下面是 Perl)

$samp = 'www.youtube.com/watch?v=XXXXXXXXX&parameter=data last few words';

$regex = qr%

(?:
    youtube\.com/
    (?:
        ( [^/]+/.+/ )    # 1
      | 
        (                # 2 
            v
          | e(?:mbed)?/
        )
      |
        ( .*[?&]v= )     # 3
    )
  |

    ( youtu\.be/ )     #4
)

( [^"&?/ ]{1,11} )     # 5, was {11}

(.*)$                  # 6 the remainder

%xi;


if ( $samp =~ /$regex/ )
{
  # just print what matched
    print "all: '$&' \n";
    print "1:   '$1' \n";
    print "2:   '$2' \n";
    print "3:   '$3' \n";
    print "4:   '$4' \n";
    print "5:   '$5' \n";
    print "6:   '$6' \n";
}

输出:

all: 'youtube.com/watch?v=XXXXXXXXX&parameter=data last few words'
1:   ''
2:   ''
3:   'watch?v='
4:   ''
5:   'XXXXXXXXX'
6:   '&parameter=data last few words'

【讨论】:

    【解决方案2】:

    .+ 更改为\S+,这样您就不会将空格作为正则表达式的一部分。

    %(?:youtube\.com/(?:[^/]+/\S+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i
    

    .* 捕获了整行,而你的正则表达式的其余部分没有做任何事情。

    【讨论】:

    • 是的,这就是我需要的。但是,我尝试了您的建议,结果相同:(也许我在其他地方搞砸了...
    【解决方案3】:

    我不清楚你到底想做什么。但我建议你尝试一个正则表达式测试工具——比如this one,但还有其他的。它使您可以直观地检查正则表达式的结果。

    【讨论】:

      【解决方案4】:

      我的错。正如我最初所怀疑的那样,正则表达式没有问题。

      我将用户输入传递给 PHP 处理程序,而没有首先通过 encodeURIComponent() 转义输入。因此,处理程序假定 &amp;parameter=data 是下一个输入参数 - 导致 POST 变量损坏。

      对不起,我的无能,感谢所有的帮助!

      【讨论】:

        猜你喜欢
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多