2016-07-14 84 views
1

使用bash或php,如何檢測文件中最後一個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'; 
    

我沒有3 & 4,因爲如果我想不通在結束標記更多的PHP之後。

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

只是好奇 - 你需要什麼?混合PHP和標記是一個文件是壞事。一旦這個問題得到解決,你應該只需要使用php文件,並且建議不要使用關閉'?>'無論如何都是這樣的情況 –

+0

除非插入PHP – Jonathan

+1

'$ str =「?>」'我不能請記住,這將是完全可能的 – 2016-07-14 23:01:30

回答

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