Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 分析高级搜索条件的单用户输入字符串_Javascript_Regex_Node.js_Pattern Matching_Xregexp - Fatal编程技术网

Javascript 分析高级搜索条件的单用户输入字符串

Javascript 分析高级搜索条件的单用户输入字符串,javascript,regex,node.js,pattern-matching,xregexp,Javascript,Regex,Node.js,Pattern Matching,Xregexp,我正在为我从头开始编写的博客开发一个自定义搜索功能。这篇博客面向有技术倾向的读者,我想让读者通过在搜索字段中定义一些高级搜索条件来搜索文章(而不是有多个搜索输入,一个用于标题,一个用于标记,一个用于类别..等等)。有点像Jiras或谷歌 我将用Javascript编写代码,但我将使用库,它支持本机RegExp没有的所有酷特性(命名组匹配、向前看、向后看等) 可搜索的“字段”为: 头衔 总结 作者 类别 标签 已创建(日期) 更新(日期) (未指定字段)常规搜索短语 要将搜索“字段”添加到搜索

我正在为我从头开始编写的博客开发一个自定义搜索功能。这篇博客面向有技术倾向的读者,我想让读者通过在搜索字段中定义一些高级搜索条件来搜索文章(而不是有多个搜索输入,一个用于标题,一个用于标记,一个用于类别..等等)。有点像Jiras或谷歌

我将用Javascript编写代码,但我将使用库,它支持本机RegExp没有的所有酷特性(命名组匹配、向前看、向后看等)

可搜索的“字段”为:

  • 头衔
  • 总结
  • 作者
  • 类别
  • 标签
  • 已创建(日期)
  • 更新(日期)
  • (未指定字段)常规搜索短语
要将搜索“字段”添加到搜索条件中,只需键入上面的字段名称之一,然后键入冒号(
),然后键入与该字段关联的搜索短语

除此之外,我希望允许查看者在搜索条件中添加一些“”和“”逻辑,例如搜索作者john.doemike.smith的文章,或带有标签bash脚本的文章。运算符可以是
|
运算符可以是
&

一些示例搜索字符串:

作者:linus标签:linuxlinux是如何起步的

  • 作者:Linus
  • 标签:Linux
  • 一般搜索短语:Linux是如何开始的
作者:john.doe| |jane.smith类别:infosec| |linux标签:linux&安全性保护您的第一台linux服务器

  • 作者:john.doejane.smith
  • 类别:InfosecLinux
  • 标签: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?" }
}

与使用正则表达式相反,这种方法几乎将整个过程卸载到代码上。如果我很难让正则表达式正常工作,那么我肯定会使用它。谢谢你!