bash — Как обнаружить закрывающий тег php?

Используя 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
  1. ЛОЖНЫЙ :

    <?php
    $var = 'value';
    
  2. ПРАВДА :

    <?php
    $var = 'value';
    ?>
    
  3. ПРАВДА :

    <?php
    $var = 'value';
    ?><!DOCTYPE>
    
  4. ПРАВДА :

    <?php
    $var = 'value';
    ?>
    <!DOCTYPE>
    
  5. ЛОЖНЫЙ :

    <?php
    $var = 'value';
    ?>
    <!DOCTYPE>
    <?php
    $var = 'something';
    
  6. ЛОЖНЫЙ :

    <?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

1

Решение

Благодаря Комментарий Райана Винсента, это было довольно легко при использовании 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);

Я даже добавил еще несколько тестов, и вы можете посмотреть полное решение здесь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]