0

所以,我需要一些控制台工具(没有异国情调)或执行以下操作的 php 函数。(我不想编写自己的递归函数,例如使用 file_get_contents())

我有一个包含几个子目录的目录。一些文件包含类似的东西,<?php ech $this->translate('string'); ?>而字符串总是不同的。

如何制作与上述函数匹配的模式并返回字符串?Atm,我会选择 grep 和 exec(); 以及用于获取我的字符串的第二个正则表达式。但也许,我可以做得更好。

我的 grep 示例:grep -r "$this[->]translate('.*')" dir

除了小问题:这有什么不同:grep -r foo dirgrep -r foo dir/*

4

3 回答 3

2

您可以通过前瞻和后瞻断言获得“字符串”: grep -rhoP "(?<=this->translate\(')[^']*(?='\))" dir

于 2012-04-20T00:00:43.800 回答
1

从你的小问题开始:

这有什么不同:grep -r foo dirgrep -r foo dir/*

第二个示例不会在dir以 a 开头的子目录中搜索.(因为它们不会被 glob 匹配)。因此,如果您的目录如下所示:

dir/
  .a_dotted_dir/
  a_visible_dir/

第一个示例将在内部搜索,.a_dotted_dir而第二个示例不会。

如何制作与上述函数匹配的模式并返回字符串?

你不能,用 grep 本身。Grep 只匹配模式,但不对它们执行任何类型的处理。您可以通过列出与您的搜索模式匹配的文件并使用 sed 处理它们来完成您想要的操作,例如:

grep -rl "this->translate('.*')" dir |
  xargs sed -n "s/.*this->translate('\([^']*\)').*/\1/p"

另外,请注意,我对您的正则表达式进行了一些更改。 [->]不匹配->,并且放在$this双引号内最终会用空字符串替换 shell $this。您需要删除$、 转义它或使用单引号。

于 2012-04-19T15:05:32.837 回答
0
  1. 使用方括号定义字符类,而美元符号将被 shell 解释为变量。您必须逃避它们才能使您的意思正确。我可能会这样做:

    echo "<?php echo \$this->translate('string'); ?>" \
      | grep -ho "\$this\s*->\s*translate('.*?')" 
      | sed "s/\$this->translate('\(.*\)')/\1/"
    

    在哪里\s代表

  2. grep -r <pattern> dir和之间的区别grep -r <pattern> dir/*有些微妙。

    当您grep -r <pattern> dir/*在命令行上运行时,实际发生的情况是shell会将dir/*参数展开到目录列表中。

    在本质上:

    grep -rho <pat> dir/*
    

    相当于:

    grep -rho <pat> dir/a dir/b dir/c [etc...]
    

    其中“a”、“b”和“c”是目录/文件。因此 grep 将递归到其中的每个目录和所有文件dir,但不会递归到 dotfiles 或 dotted 目录。

    最好使用grep -rho <pat> dir,它将所有文件都考虑在内。

于 2012-04-19T15:12:15.053 回答