我正在尝试创建一个搜索字符串,它可以接受这样的查询:
$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()时它们不会被破坏。
答案 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。