【问题标题】:using Laravel Query builder to exclude certain string使用 Laravel 查询生成器排除某些字符串
【发布时间】:2016-08-28 06:02:23
【问题描述】:

假设我有一个名为table 的表,它有一个名为path 的列,path 中的字符串格式如下所示

row path
1   /path1/aa/bg/c/da
2   /path1/ab/v
3   /path1/a/ba/ca

如您所见,每个段由字符 / 分隔。 如何使用like 格式化where 中的条件,以便返回的唯一行是row 22 slashes

我试过了 DB::table('table')->where('path','LIKE','/path1/%/%')->get()

但是上面的查询将返回由于最后一个% 而产生的所有行。如何在最后一个% 之后排除/,以便最后一个% 之后具有字符/ 的记录不会包含在结果中?

【问题讨论】:

标签: php mysql laravel laravel-query-builder


【解决方案1】:

如果您正在寻找匹配一个字符:

DB::table('table')->where('path','LIKE','/path1/_/_')->get()

"test%" 匹配之后的所有字符

"%test" 匹配之前的所有字符

“_”匹配一个字符

ELSE 如果你匹配的字符串长度是可变的,你只能使用正则表达式,

select * from table where path REGEXP '\/path1\/[a-zA-Z0-9_]+\/[a-zA-Z0-9_]+'

更多通用匹配匹配特殊字符:

select * from table where path REGEXP '\/path1\/.+\/.+'

【讨论】:

  • 长度无法确定,因为它是动态的。该模式用于通过比较 back slash 的数量来将段与存储在 path 中的段进行匹配
  • back slash 后面的字符可以是@ 等特殊字符。您能否帮我详细说明[a-zA-Z0-9_] 的模式。它是否尝试匹配任何字母数字字符?
  • 这里regexr.com你可以测试你的正则表达式,匹配@你可以使用这个\/path1\/[a-zA-Z0-9_@]+\/[a-zA-Z0- 9_@]+
  • 这对你来说是完美的正则表达式,请尝试一下 "\/path1\/.+\/.+"
  • 非常感谢。如何使@ 成为可选的?我猜.+ 匹配任何字符对吗?最后一个在Laravelphpmyadmin 中都可以正常工作,但第一个仅在phpmyadmin 中有效,但最后一个仍将返回所有记录
猜你喜欢
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
相关资源
最近更新 更多