通过不显眼的验证正则表达式识别有效的 YouTube 网址在 MVC 3 中不起作用

发布于 2024-12-13 05:43:09 字数 2248 浏览 1 评论 0 原文

我找不到解决此错误的方法。

中有此代码

我的模型MultimediaLanguageEdit.cs

public class MultimediaLanguageEdit
{ 
    //[RegularExpression(@"((?<=^https?://(www\.)?youtube\.com/.*v=)\w+)|((?<=^https?://youtu\.be/)\w+)|((?<=src=""https?://(www\.)?youtube\.com/v/)\w+)|((?<=src=""https?://(www\.)?youtube\.com/embed/)\w+)",
    [RegularExpression(@"(^https?://(www\.)?youtube\.com/.*v=\w+)|(^https?://youtu\.be/\w+)|(src=.https?://(www\.)?youtube\.com/v/\w+)|(src=.https?://(www\.)?youtube\.com/embed/\w+)",
                        ErrorMessageResourceType = typeof(ErrorMessages),
                        ErrorMessageResourceName = "FieldRegExp")]
    public string Text { get; set; }
}

,视图

MultimediaLanguageEdit.cshtml

@model MultimediaLanguageEdit

<div class="editor-label">
    @Html.LabelFor(m => m.Text, "Codice HTML:")
</div>
<div class="editor-field">
    @Html.TextAreaFor(m => m.Text)
    @Html.ValidationMessageFor(m => m.Text)
</div>

中有此代码,并且该字段始终无效 对于所有此案例测试

  • http://www.youtube.com/watch?v=tYTIo6H19uw&feature=grec_index
  • <参数名称=“allowscriptaccess”值=“总是”> <嵌入 src="http://www.youtube.com/v/tYTIo6H19uw?version=3&hl=it_IT" type="application/x-shockwave-flash" width="560" height="315 “allowscriptaccess =“总是”allowfullscreen =“true”&gt;&lt;/嵌入&gt;

并匹配此测试用例

但如果我在 自定义编辑器甚至在控制器中,我对每种情况都有一个匹配。

这段代码有什么问题?

I can't find a way to get through this error.

I've got this code in my model

MultimediaLanguageEdit.cs

public class MultimediaLanguageEdit
{ 
    //[RegularExpression(@"((?<=^https?://(www\.)?youtube\.com/.*v=)\w+)|((?<=^https?://youtu\.be/)\w+)|((?<=src=""https?://(www\.)?youtube\.com/v/)\w+)|((?<=src=""https?://(www\.)?youtube\.com/embed/)\w+)",
    [RegularExpression(@"(^https?://(www\.)?youtube\.com/.*v=\w+)|(^https?://youtu\.be/\w+)|(src=.https?://(www\.)?youtube\.com/v/\w+)|(src=.https?://(www\.)?youtube\.com/embed/\w+)",
                        ErrorMessageResourceType = typeof(ErrorMessages),
                        ErrorMessageResourceName = "FieldRegExp")]
    public string Text { get; set; }
}

and this code in my View

MultimediaLanguageEdit.cshtml

@model MultimediaLanguageEdit

<div class="editor-label">
    @Html.LabelFor(m => m.Text, "Codice HTML:")
</div>
<div class="editor-field">
    @Html.TextAreaFor(m => m.Text)
    @Html.ValidationMessageFor(m => m.Text)
</div>

and the field is always invalid for all this case test

  • http://www.youtube.com/watch?v=tYTIo6H19uw&feature=grec_index
  • <iframe width="560" height="315" src="http://www.youtube.com/embed/tYTIo6H19uw" frameborder="0" allowfullscreen></iframe>
  • <object width="560" height="315">
    <param name="movie" value="http://www.youtube.com/v/tYTIo6H19uw?version=3&hl=it_IT"></param><param name="allowFullScreen" value="true"></param>
    <param name="allowscriptaccess" value="always"></param>
    <embed src="http://www.youtube.com/v/tYTIo6H19uw?version=3&hl=it_IT" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed>
    </object>

and match this test case

but if I test the the regex in a custom editor or even in a controller, I've a got a match for every case.

What is wrong with this code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苄①跕圉湢 2024-12-20 05:43:09

正确的 RegExp 是

(https?://(www\.)?youtube\.com/.*v=\w+.*)|(https?://youtu\.be/\w+.*)|(.*src=.https?://(www\.)?youtube\.com/v/\w+.*)|(.*src=.https?://(www\.)?youtube\.com/embed/\w+.*)

因为 javascript 检查 RegExp 的整行并期望从头到尾正确匹配。

The correct RegExp is

(https?://(www\.)?youtube\.com/.*v=\w+.*)|(https?://youtu\.be/\w+.*)|(.*src=.https?://(www\.)?youtube\.com/v/\w+.*)|(.*src=.https?://(www\.)?youtube\.com/embed/\w+.*)

Because javascript check the whole line of RegExp and expect a correct match from the beginning to the end.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文