如何检测关闭php标签?

时间:2016-07-14 22:46:44

标签: php bash line-endings

使用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
  1. FALSE:

    <?php
    $var = 'value';
    
  2. TRUE:

    <?php
    $var = 'value';
    ?>
    
  3. TRUE:

    <?php
    $var = 'value';
    ?><!DOCTYPE>
    
  4. TRUE:

    <?php
    $var = 'value';
    ?>
    <!DOCTYPE>
    
  5. FALSE:

    <?php
    $var = 'value';
    ?>
    <!DOCTYPE>
    <?php
    $var = 'something';
    
  6. FALSE:

    <?php
    $var = 'value';
    ?><?php
    $var = 'something';
    
  7. 我失败3&amp; 4因为我无法弄清楚结束标签之后的内容是否更多是php。

    [X] 1.false
    [X] 2.true
    [ ] 3.true
    [ ] 4.true
    [X] 5.false
    [X] 6.false
    

1 个答案:

答案 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