我已经在这个问题上坚持了一段时间。 最终范围:解析php文件的内容(打开为文本文件)并获取函数t()的第一个参数。
这是我到目前为止所做的:
<\?[(?:php)]{1}.*?t\(["'](.*?)["']\s*,*.*?\).*[\?>]*
对于以下内容,它应该返回&#34;测试1&#34;通过测试18。
这是文本(我知道存在语法错误)。
<?php t('Test 1') ?>
<?php t("Test 2") ?>
<?php= t("This should fail") ?>
<?php = t("This should fail") ?>
<?php =t("This should fail") ?>
<?=t("Test 3")?>
<?=
t("Test 4") ?>
<?= $vrum+$vrum;t('Test 5')?>
<?= t('Test 6') ?>
<?=t("Test 7",$a)?>
<?=t("Test 8 %s, %d",$b,$a)?>
<?=t("Test 9 %s, %d", $b, $a)?>
<?php echo t("Test 10");?>
<?php echot("This should fail");?>
<?phpecho t("This should fail");?>
<?php echo t('Test 11');?>
<?php echo t('Test 12 %s\'%d',$a , $b);?>
<?php echo t('Test 13 %s\'%d\'',$a , $b);?>
<?php echo t('Test 14 %s\'%d',t('Test 15') , $b);?>
<?php echo t('Test 16 %s\'%d', t('Test 17') , $b);?>
<?php echo T("This should fail");?>
<?php echo t("Test 18");
我在函数之前遇到问题,因为它需要是一个有效的php标记
<?php (followed by a space) or <?= (with or without space)
有人可以指出我正确的方向吗?
由于
答案 0 :(得分:1)
您不需要使用正则表达式解析有效的PHP代码,因为有一个内置的tokenizer可用:
$tokens = token_get_all($text);
foreach ($tokens as $i => $token) {
if ($token[0] == T_STRING && isset($tokens[$i + 1])) {
$next = $tokens[$i + 1];
if (is_string($next) && $next == '(' && isset($tokens[$i + 2])) {
$arg = $tokens[$i + 2];
var_dump($arg[1]);
}
}
}
注意:它并不完全符合您的要求,但添加它是微不足道的,因此请将其作为正确解决方案的基础
参考文献:
答案 1 :(得分:1)
就像那样:
<\?(?:php(?:\s+echo+)?\s+|=[^=]*?\s*)t\(["'](.*?[^\\])["'].*?(?:t\(["'](.*?[^\\])["']\).*?)*\).*[\?>]*