Php 只逃脱特殊的角色

Php 只逃脱特殊的角色,php,zend-framework2,zend-search-lucene,Php,Zend Framework2,Zend Search Lucene,我正在使用QueryParser::parse方法从ZendSearch Lucene索引的字符串搜索词中获取查询。但我对以下查询有一个问题: +php +5.7.1) 这将抛出带有以下消息的QueryParserException: 语法错误:括号不匹配,每个开头必须有结尾 因此,在将字符串搜索词传递给QueryParser::parse之前,我使用QueryParser::escape对其进行了转义,但随后它将转义所有内容,从而生成以下字符串: \\+\\p\\h\\p\\ \\+\\5\

我正在使用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+5.7.1这样的查询,它不应该被转义,因为它有一个开始括号和一个结束括号。你不能两者都转义吗?不,如果它们都出现,我需要它们,因为这是查询的一部分,因此是一个有效的术语。但是仅仅是一个结束括号,这不应该被转义。在我看来,当用户输入无效语法时,您应该抛出一个错误。否则会导致这种奇怪的情况,你不想逃避任何东西,除非它是无效的,在这种情况下,你只会逃避无效的部分。我认为这段代码太聪明了。如果你还想这么做,你必须构建自己的解析器。没有这样的内置功能。
$escapedParenthesis = addcslashes('+php +5.7.1)','\\)');