Используя 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
Вы можете клонировать эти файлы, но это то, что у меня так далеко.
.
├── closed-php.bash
├── test.bash
└── tests
├── 1.false
├── 2.true
├── 3.true
├── 4.true
├── 5.false
└── 6.false
ЛОЖНЫЙ :
<?php
$var = 'value';
ПРАВДА :
<?php
$var = 'value';
?>
ПРАВДА :
<?php
$var = 'value';
?><!DOCTYPE>
ПРАВДА :
<?php
$var = 'value';
?>
<!DOCTYPE>
ЛОЖНЫЙ :
<?php
$var = 'value';
?>
<!DOCTYPE>
<?php
$var = 'something';
ЛОЖНЫЙ :
<?php
$var = 'value';
?><?php
$var = 'something';
Я терплю неудачу 3 & 4, потому что я не могу понять, что после закрывающего тега больше php или нет.
[X] 1.false
[X] 2.true
[ ] 3.true
[ ] 4.true
[X] 5.false
[X] 6.false
Благодаря Комментарий Райана Винсента, это было довольно легко при использовании 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);
Я даже добавил еще несколько тестов, и вы можете посмотреть полное решение здесь.
Других решений пока нет …