使用bash或php,我如何检测文件中最后一个php块是否有结束标记,而不管尾随的换行符或空格?
这是我到目前为止所得到的,但是我无法弄清楚如何判断结束标记之后是否有更多的PHP。
#!/bin/bash
FILENAME="$1"
closed=false
# just checking the last 10 lines
# should be good enough for this example
for line in $(tail $FILENAME); do
if [ "$line" == "?>" ]; then
closed=true
else
closed=false
fi
done
if $closed; then
exit 1
else
exit 0
fi
我用测试运行脚本编写了一些测试。
#!/bin/bash
for testfile in $(ls tests); do
./closed-php.bash tests/$testfile
closed=$?
if [ $closed -eq 1 -a "true" == ${testfile##*.} ] ||
[ $closed -eq 0 -a "false" == ${testfile##*.} ]; then
echo "[X] $testfile"
else
echo "[ ] $testfile"
fi
done
你可以clone these files,但这是我到目前为止所做的。
.
├── closed-php.bash
├── test.bash
└── tests
├── 1.false
├── 2.true
├── 3.true
├── 4.true
├── 5.false
└── 6.false
FALSE:
<?php
$var = 'value';
TRUE:
<?php
$var = 'value';
?>
TRUE:
<?php
$var = 'value';
?><!DOCTYPE>
TRUE:
<?php
$var = 'value';
?>
<!DOCTYPE>
FALSE:
<?php
$var = 'value';
?>
<!DOCTYPE>
<?php
$var = 'something';
FALSE:
<?php
$var = 'value';
?><?php
$var = 'something';
我失败3&amp; 4因为我无法弄清楚结束标签之后的内容是否更多是php。
[X] 1.false
[X] 2.true
[ ] 3.true
[ ] 4.true
[X] 5.false
[X] 6.false
答案 0 :(得分:1)
感谢Ryan Vincent's comment,使用token_get_all
<?php
$tokens = token_get_all(file_get_contents($argv[1]));
$return = 0;
foreach ($tokens as $token) {
if (is_array($token)) {
if (token_name($token[0]) === 'T_CLOSE_TAG')
$return = 0;
elseif (token_name($token[0]) === 'T_OPEN_TAG')
$return = 1;
}
}
exit ($return);
我甚至添加了一些测试,你可以see the full solution here。