PHP自动检测可翻译/通过正则表达式检测代码片段

PHP自动检测可翻译/通过正则表达式检测代码片段,php,regex,zend-framework,detection,Php,Regex,Zend Framework,Detection,我有一个多语言站点,它在一个default.php中存储可翻译的内容,该文件填充了一个包含所有键的数组 我想让它自动运行。 我已经有了一个(singleton)类,它能够根据类型检测我的所有文件。(控制器、动作、视图、模型等) 我想检测格式如下的任何代码: $this->translate('[a-zA-Z]'); $view->translate('[a-zA-Z]'); getView()->translate('[a-zA-Z]'); throw new Exceptio

我有一个多语言站点,它在一个default.php中存储可翻译的内容,该文件填充了一个包含所有键的数组

我想让它自动运行。 我已经有了一个(singleton)类,它能够根据类型检测我的所有文件。(控制器、动作、视图、模型等)

我想检测格式如下的任何代码:

$this->translate('[a-zA-Z]');
$view->translate('[a-zA-Z]');
getView()->translate('[a-zA-Z]');
throw new Exception('[a-zA-Z]');
addMessage(array('message' => '[a-zA-Z]');
但是,当它以/包含以下内容开始时,必须对其进行过滤:

$this->translate('((0-9)+_)[a-zA-Z]');
$this->translate('[a-zA-Z]' . $* . '[a-zA-Z]'); // Only a variable in the middle must filtered, begin or end is still allowed
当然[a-zA-Z]是一个正则表达式示例

就像我说的,我已经有了一个检测特定文件的类。这个类也使用反射(或者在本例中使用Zend反射,因为我使用Zend),但是我看不到使用正则表达式反射函数的方法

该操作将放在一个名为action的cronjob和manual中,因此当使用的内存有点“太”大时,这不是一个大问题。

Description
[$]这个->翻译[(]'((?:[^'\\]\\.\.\\.\''.'')][);

**要更好地查看图像,只需右键单击图像并选择“在新窗口中查看”

此正则表达式将执行以下操作:

  • $this开头的代码块翻译(“
    通过它的结尾
    ”)
  • 引号内的值放入捕获组1
  • 避免子字符串中可能包含看起来像结束符的混乱边缘情况字符串,实际上可以转义字符
例子 现场演示

示例文本

$This->Translate(“(?:Droids\”);{2}”);
$NotTranalate('fdasad');
$this->translate('a-zA-Z]');
样本匹配

匹配1
1.[17-33]“机器人”;{2}`
比赛2
1.[79-87]`[a-zA-Z]`
解释
节点说明
----------------------------------------------------------------------
(?-imsx:组,但不捕获(区分大小写)
(通常与^和$匹配)(与.not匹配)
匹配\n)(匹配空白和#
通常情况下):
----------------------------------------------------------------------
[$]的任何字符:“$”
----------------------------------------------------------------------
此->翻译“此->翻译”
----------------------------------------------------------------------
[(]的任何字符:'('
----------------------------------------------------------------------
'                        '\''
----------------------------------------------------------------------
(组和捕获到\1:
----------------------------------------------------------------------
(?:组,但不捕获(0或更多)
次数(与最大金额匹配)
(可能的):
----------------------------------------------------------------------
[^'\\]除:“”、'\\'以外的任何字符
----------------------------------------------------------------------
|或
----------------------------------------------------------------------
\\                       '\'
----------------------------------------------------------------------
.除以下字符以外的任何字符\n
----------------------------------------------------------------------
|或
----------------------------------------------------------------------
''                       '\'\''
----------------------------------------------------------------------
)*分组结束
----------------------------------------------------------------------
)结束\1
----------------------------------------------------------------------
'                        '\''
----------------------------------------------------------------------
[)]的任何字符:')'
----------------------------------------------------------------------
;                        ';'
----------------------------------------------------------------------

你能编辑你的问题来显示你想要匹配的示例字符串吗?$this translate('[a-zA-Z]');字符串会有所不同,但我总是试图保持这样。例如“Controller\u Default\u Welcome”我收到以下错误
preg\u match\u all():编译失败:丢失)在偏移量45处,当使用以下代码时,
preg\u match\u all(“/[$]this->translate[(])(((?:[^'\]\\\\.\124;'')'[)];/mix“,$this->content,$matches)编辑:使其工作
preg\u match\u all(“/[$]此翻译[(]”((?:[^'\\\\]\\\\\.\\\.\124;'')'[)]/mix“,$this->content,$matches)但是preg_match_all不会返回$matches中的结果;在第一个示例中,您有
this->translate
,而在第二个示例中,您有
this translate
字符重要吗?是的,缺少的>是一个错误,>,或者更好地说->,是translate()的方法调用;虽然我在代码中修复了这一切,但还有一点,羞耻。感谢您的帮助如果字符串(translate函数的参数)以一个或多个数字开头,后跟_,类似于“1_产品_名称”,是否有方法防止捕获?(当数字在cq中处于中间位置而不是开始位置时,仍应捕获该数字。因此应防止只捕获开始位置)您是否可以编辑原始问题,以显示您希望看到的内容的完整示例,以及您希望如何匹配?