使用grep进行精确匹配,但也在搜索字符串上使用转义字符(使用PHP)

使用grep进行精确匹配,但也在搜索字符串上使用转义字符(使用PHP),php,regex,linux,unix,Php,Regex,Linux,Unix,我有一个名为Records的目录,其中有一个文件record.txt,该文件包含- id=12345 name=O'Wright Inc record1=0123456789\01234/5678912x record2=0123456789|012345ajsdnjqw record3=0123456789/012345ajsdnjqw 我有一个PHP文件,我正在尝试为例如name=O'Wright Inc.做一个精确匹配。 我现在拥有的是- echo "Enter the uni

我有一个名为Records的目录,其中有一个文件record.txt,该文件包含-

id=12345
name=O'Wright Inc
record1=0123456789\01234/5678912x
record2=0123456789|012345ajsdnjqw
record3=0123456789/012345ajsdnjqw
我有一个PHP文件,我正在尝试为例如name=O'Wright Inc.做一个精确匹配。 我现在拥有的是-

echo "Enter the unique book identifier (Book ID): ";
$val = addslashes(trim(fgets(STDIN)));
$path = shell_exec("grep -rE '(^)$vals($)'");
var_dump($path);
如果我搜索id=12345,我会返回正确的结果。 但是如果我搜索name=O'Wright Inc,结果是空的

我正在寻找一种方法来转义
\
字符。我已经添加了addslashes,它与一个包含
/
的字符串一起工作,但是我也想转义并搜索其他字符

更新: 如果我删除
addslashes
并重写
$path=shell_exec(“grep-rE'(^)$vals($)”作为->
$path=shell\u exec(“grep-rE\”(^)$vals($)\”)
然后它处理字符串中的
字符,因此搜索
name=O'Wright Inc
将返回正确的结果


建议我分别处理斜杠和管道吗?

因为您的代码为shell参数生成了错误转义的输出,这就是存在的原因

您应该这样构造命令字符串:

$val=“O'Brien”;
$expression=escapeshellarg((^)$val($)”;
$command=“grep-rE$expression”;
变量转储($命令);
输出:

string(27) "grep -rE '(^)O'\''Brien($)'"

另外,在正则表达式中,
^
$
周围不需要括号。

谢谢,它可以很好地处理字符串中的单个引号。但如果搜索记录1=0123456789\01234/5678912x,它仍然返回Null,如果搜索记录2=0123456789 | 012345ajsdnjqw,则返回所有结果。我是否需要分别为反斜杠和管道转义,以便它返回精确的匹配?这可能是与您如何接受和处理用户输入有关的另一个问题。我建议提交一个新问题,特别是关于新问题的问题,并包括获取用户输入的代码。@manishk您需要转义正则表达式中使用的任何字符,如管道。这听起来像一个XY问题;为什么要使用
grep
而不仅仅是使用PHP来实现这一点?这是因为目录记录可以有具有层次结构的子目录,然后它们有类似record.txt格式的文件。因此,我需要根据用户输入查找文件,这些文件可以是record1=0123456789\01234/5678912x或id=12345(精确匹配)。