【问题标题】:Escape only particular special chars仅转义特定的特殊字符
【发布时间】:2014-08-11 07:04:48
【问题描述】:

我正在使用QueryParser::parse() 方法从我的ZendSearch Lucene 索引的字符串搜索词中获取查询。但我对以下查询有疑问:

+php +5.7.1)

这会抛出带有消息的QueryParserException

语法错误:括号不匹配,每个开头都必须有结尾。

所以我在传递给QueryParser::parse() 之前使用QueryParser::escape() 转义了字符串搜索词,但随后它转义了所有内容,因此这导致了这个字符串:

\\+\\p\\h\\p\\ \\+\\5\\.\\7\\.\\1\\)

现在QueryParserException 已经消失,但也可以使用特殊字符,如+- 等。

我正在寻找一种方法来逃避特殊字符,这将导致 QueryParserException 所以在我的情况下 ) 应该被转义,因为查询中没有左括号 ) 但我的两个 +应该保持不变。

有没有可能实现这一目标?不进行解析就构建查询本身不是一种选择,因为搜索词是用户输入。

我尝试使用QueryParser::suppressQueryParsingExceptions(),这可能是我正在寻找的东西,但它没有效果。 QueryParser 仍然会抛出 QueryParserException,尽管它的默认值为 true

【问题讨论】:

    标签: php zend-framework2 zend-search-lucene


    【解决方案1】:

    你可以使用addcslashes

    $escapedParenthesis = addcslashes('+php +5.7.1)','\\)');
    

    【讨论】:

    • 这在这个特定的情况下可以解决问题。但是,如果我有一个像 +php +(5.7.1) 这样的查询,它不应该被转义,因为它有一个左括号和一个右括号。
    • 你不能同时逃脱吗?
    • 不,如果它们同时出现,我需要它们,因为这将查询的一部分分组,因此是一个有效的术语。但只是一个右括号,所以这应该被转义。
    • 在我看来,当用户输入无效语法时,您应该只抛出错误。否则会导致这种奇怪的情况,您不想逃避任何东西,除非它是无效的,在这种情况下,您只逃避无效的部分。我认为代码太聪明了。
    • 如果您仍然想这样做,您将不得不构建自己的解析器。没有这样的内置功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2019-01-29
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多