【问题标题】:Regular expression that starts with a certain string and ignores those that contain a specific string以特定字符串开头并忽略包含特定字符串的正则表达式
【发布时间】:2013-03-06 10:16:49
【问题描述】:

我正在尝试在 PHP 中编写一个正则表达式,它可以匹配任何包含“search/site/*”的字符串,但前提是它不包含字符串“ss_language”

这是我目前所拥有的:http://regexr.com?3416i 这成功匹配任何“搜索/站点/*”,包括“搜索/站点”,所以现在我需要排除任何包含“ss_language”的字符串的位

考虑到这一点,我似乎可以嵌套另一个 preg_match 来查找 ss_language,但与单个正则表达式相比,这是最好的方法吗?这甚至可以用一个正则表达式来实现吗?以下是一些示例以及它们应返回的内容:

  • 通过 - 搜索/站点
  • 通过 - 搜索/站点/猫
  • 通过 - search/site/dog?f[0]=im_field_technology%3A20858
  • 通过 - search/site/cat%20dog?f[0]=im_field_technology%3A20858
  • 失败 - search/site/cat%20dog?f[0]=ss_language%3Aen
  • 失败 - 搜索/站点/?f[0]=im_field_technology%3A20858&f[1]=ss_language%3Aen
  • 失败 - 搜索/站点/?f[1]=ss_language%3Aen&f[0]=im_field_technology%3A20858
  • 通过 - 搜索/站点/?f[0]=im_field_technology%3A20858&f[1]=im_field_technology%3A20875o
  • 失败 - 节点/23/编辑

提前感谢您的帮助。我对这些很陌生。这是一次失败的尝试:http://regexr.com?3416f

【问题讨论】:

  • 什么是search/site/cat%20dog?f[0]=ss_langu%61ge - 通过还是失败?
  • 您不需要正则表达式来完成此操作,请参阅下面的示例,使用简单的strpos() 检查。

标签: php regex preg-match


【解决方案1】:

您可以使用否定前瞻来断言字符串不包含ss_language

^search/site/?(?!.*ss_language.*).*$

如果你只是想要一个判断它是否匹配的真/假答案,那么你真的不需要.*$(它只会匹配search/site和可选的/,因为没有@987654326 @ 字符串中的任意位置(短版):

^search/site/?(?!.*ss_language)

【讨论】:

  • rvalvik,效果很好!谢谢你。我标记了您的答案,但没有将其标记为正确答案,只是因为下面使用 strpos 而不是正则表达式的答案可以满足我的需要,但速度更快。但是您的答案是正确的正则表达式解决方案,所以我希望人们知道这一点。再次感谢!
【解决方案2】:

您不需要使用速度较慢的正则表达式。使用strpos()

$status = (0 === strpos($url, 'search/site') && FALSE === strpos($url, 'ss_language'))
    ? 'PASS'
    : 'FAIL';

查看:DEMO

基本上它的作用是检查 URL 是否以 search/site 开头,如果是,则检查它是否不包含 ss_language 并返回 TRUEFALSE 或 Pass/在这个例子中失败。完全不需要正则表达式,因为您只是在寻找子字符串。

【讨论】:

  • 感谢 cryptic,这正是我需要的 strpos 而不是正则表达式,这确实更快,因此我将其标记为正确答案。我从来没有想过只使用 strpos 作为我使用正则表达式构建的示例。
【解决方案3】:

您可以查看http://regexr.com?3417a 以获取以下正则表达式:

^search/site/?(?:(?!ss_language).)*$

确实是在使用负前瞻。

【讨论】:

  • 这个正则表达式(类似于上面的)也可以。我还没有代表支持你(对 SO 来说太新了),但我想让人们知道我测试过它并且它确实有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2015-04-10
  • 2014-03-04
  • 1970-01-01
  • 2010-10-06
  • 2017-09-17
相关资源
最近更新 更多