Javascript 分析高级搜索条件的单用户输入字符串
我正在为我从头开始编写的博客开发一个自定义搜索功能。这篇博客面向有技术倾向的读者,我想让读者通过在搜索字段中定义一些高级搜索条件来搜索文章(而不是有多个搜索输入,一个用于标题,一个用于标记,一个用于类别..等等)。有点像Jiras或谷歌 我将用Javascript编写代码,但我将使用库,它支持本机RegExp没有的所有酷特性(命名组匹配、向前看、向后看等) 可搜索的“字段”为:Javascript 分析高级搜索条件的单用户输入字符串,javascript,regex,node.js,pattern-matching,xregexp,Javascript,Regex,Node.js,Pattern Matching,Xregexp,我正在为我从头开始编写的博客开发一个自定义搜索功能。这篇博客面向有技术倾向的读者,我想让读者通过在搜索字段中定义一些高级搜索条件来搜索文章(而不是有多个搜索输入,一个用于标题,一个用于标记,一个用于类别..等等)。有点像Jiras或谷歌 我将用Javascript编写代码,但我将使用库,它支持本机RegExp没有的所有酷特性(命名组匹配、向前看、向后看等) 可搜索的“字段”为: 头衔 总结 作者 类别 标签 已创建(日期) 更新(日期) (未指定字段)常规搜索短语 要将搜索“字段”添加到搜索
- 头衔
- 总结
- 作者
- 类别
- 标签
- 已创建(日期)
- 更新(日期)
- (未指定字段)常规搜索短语
:
),然后键入与该字段关联的搜索短语
除此之外,我希望允许查看者在搜索条件中添加一些“或”和“和”逻辑,例如搜索作者john.doe或mike.smith的文章,或带有标签bash和脚本的文章。或运算符可以是|
,和运算符可以是&
一些示例搜索字符串:
作者:linus标签:linuxlinux是如何起步的
- 作者:Linus
- 标签:Linux
- 一般搜索短语:Linux是如何开始的
- 作者:john.doe或jane.smith
- 类别:Infosec或Linux
- 标签:Linux或安全性
- 一般搜索短语:保护您的第一台Linux服务器
我希望通过Regex尽可能多地完成字符串解析。我有点不对劲,但我有一个问题,匹配一个模式多次,由空格分开。。因此,任何帮助都将不胜感激。谢谢 ps.对不起,我没有用你的库。我通常只有在真正需要的时候才会回到libs。你的留言读得不够好。除此之外,我认为代码可读/易于编辑(与大多数regexp不同) 我也看到了nodejs标记,如果您使用它来“发送”,您可以轻松地将这些对转换为键/值,如下所示:
const pairSeperator = ':';
const valueSeperators = [
{ splitter: '||', replacingValue: 'OR' },
{ splitter: '&&', replacingValue: 'AND' },
];
const validKeyNames = [
'title',
'summary',
'author',
'category',
'tag',
'created',
'updated',
];
function isValidKeyValuePair(input) {
const possiblePair = input.split(pairSeperator);
if (possiblePair.length == 2) {
return validKeyNames.indexOf(possiblePair[0]) > -1;
}
return false;
}
function parseValue(value) {
const valueSeperator = valueSeperators.find((s) => value.indexOf(s.splitter) > -1);
if (valueSeperator) {
return value
.split(valueSeperator.splitter)
.join(` ${valueSeperator.replacingValue} `);
}
return value;
}
function pairReduce(memo, strPair) {
const [key, value] = strPair.split(pairSeperator);
obj[key] = parseValue(value);
return obj;
}
// this is function which handles your searchTerm
function parseSearch(searchTerm) {
const splittedSearchTerm = searchTerm.split(' ');
const filters = splittedSearchTerm
.filter(isValidKeyValuePair)
.reduce(pairReduce, {});
const searchTerm = splittedSearchTerm
.filter(input => !isKeyValuePair(input))
.join(' ');
return Object.assign(filters, { searchTerm });
// input: parseSearch("tag:linux why Linux rocks?");
// output: { "tag": "linux", "searchTerm": "why Linux rocks?" }
}
与使用正则表达式相反,这种方法几乎将整个过程卸载到代码上。如果我很难让正则表达式正常工作,那么我肯定会使用它。谢谢你!