【问题标题】:How to exclude a word or string from an URL - Regex如何从 URL 中排除单词或字符串 - 正则表达式
【发布时间】:2014-04-21 22:34:52
【问题描述】:

我正在使用以下正则表达式来匹配 PHP 中所有类型的 URL(效果很好):

 $reg_exUrl = "%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s";

但现在,我想排除 Youtube、youtu.be 和 Vimeo URL:

研究后我正在做这样的事情,但它不起作用:

$reg_exUrl = "%\b(([\w-]+://?|www[.])(?!youtube|youtu|vimeo)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s";

我想这样做,因为我有另一个匹配 Youtube url 的正则表达式,它返回一个 iframe,这个正则表达式导致两个正则表达式之间的混淆。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 为什么不在第二步过滤掉不需要的域呢?甚至更好:第三步。第二步应该是 URL 规范化。然后它就非常简单而且更加健壮。
  • 仅供参考,原来的答案很笼统,但我专门为您的情况添加了一个正则表达式。
  • 感谢您的评论@hakre,但我对正则表达式不太了解,恰好我有一个评论系统,然后,我想做的是检测所有的url(到使用“href”)、标签(搜索)和 youtube 的 url(iframe)使它们可点击,当我从数据库中获取数据以最终显示给用户时,我必须同时执行所有这些操作。跨度>

标签: php regex url


【解决方案1】:

socodLib,要从字符串中排除某些内容,通过使用 ^ 锚定(或使用另一个锚点)将自己置于字符串的开头,并使用否定前瞻断言字符串不包含单词,像这样:

^(?!.*?(?:youtube|some other bad word|some\.string\.with\.dots))

在我们通过将正则表达式与您的连接使正则表达式看起来过于复杂之前,让我们看看如果您想匹配某些单词字符 \w+ 而不是 youtube 或 google,我们会做什么,您会写:

^(?!.*?(?:youtube|google))\w+

如您所见,在断言之后(我们说我们不想要的),我们通过使用 \w+ 说我们想要 p>

在您的情况下,让我们为您的初始正则表达式添加一个负前瞻(我尚未调整):

$reg_exUrl = "%(?i)\b(?!.*?(?:youtu\.?be|vimeo))(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s";

我冒昧地使用(?i) 使正则表达式不区分大小写。您也可以在末尾添加 i 到您的 s 修饰符。 youtu\.?be 表达式允许使用一个可选的点。

我确信您将来可以将此配方应用于您的表达式和其他正则表达式。

参考

  1. Regex lookarounds
  2. StackOverflow regex FAQ

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 2021-01-02
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2014-06-21
    • 2016-05-09
    相关资源
    最近更新 更多