展开搜索字符串

时间:2018-10-11 16:06:38

标签: php regex search

我正在尝试创建一个搜索字符串,它可以接受这样的查询:

$string = 'title -launch category:technology -tag:news -tag:"outer space"$';

以下是我要做什么的简要说明:

$ = suffix indicating that the match should be exact
" = double quotes indicate that the multi-word is taken as a single keyword
- = a prefix indicating that the keyword is excluded

这是我当前的解析器:

$string = preg_replace('/(\w+)\:"(\w+)/', '"${1}:${2}', $string);
$array = str_getcsv($string, ' ');

我之前使用的是上面的代码,但是对于以 -tag:“外层空间” 之类的搜索开头的关键字,它无法正常工作。上面的代码无法识别以-字符开头的字符串,并且尽管使用双引号将其括在外部空格之间的空白处,但该关键字仍会中断。

编辑:我要用该代码执行的操作是将preg_replace -tag:“ outer space”转换为“ -tag:outer space”,以便当我将字符串传递给str_getcsv()时它们不会被破坏。

2 个答案:

答案 0 :(得分:1)

这是我的做法:

$string = preg_replace('/(\-?)(\w+?\:?)"(\w+)/', '"$1$2$3', $string);
$array = str_getcsv($string, ' ');

对于没有类别/标签+冒号前缀的多单词引用引号,我考虑了类似“-十大”之类的格式。

对不起,我很慢,我是新来的正则表达式,PHP和一般编程人员,这也是我在stackoverflow中的第一篇文章。我正在尝试将其作为个人爱好来学习。我很高兴今天学到了一些新知识。我将阅读有关正则表达式的更多信息,因为它看起来可以做很多事情。

答案 1 :(得分:1)

您可以像这样使用preg_replace

 preg_replace('/(-?\w+:)"([^"]+)"/', '"$1$2"', $str);

请参见PHP demo online

正则表达式匹配:

  • (-?\w+:)-捕获组1:一个可选的-?匹配1或0个匹配项),然后是1+个字母/数字/下划线和一个:
  • "-双引号(将被删除)
  • ([^"]+)-捕获第2组:双引号以外的一个或多个字符
  • "-双引号

替换模式为"$1$2"",捕获第1组的值, 捕获第2组的值和一个"

请参见regex demo here