2010-09-01 16 views
1

我要編輯另一個在他的腳本中使用php短標籤的人的項目。我在我的服務器中禁用了短標籤。我認爲轉換所有的短標籤,而不是在我的服務器中啓用短標籤是更好的。如何將php短標籤轉換爲全長

所以哪個方向走的更好:

  1. 將所有短標籤?

  2. 在我的服務器中啓用短標籤?

  3. 如何我所有的短標籤轉換成全一個批次

+0

http://www.emurasoft.com/replall/detail.htm – 2010-09-01 06:55:38

+0

只需啓用短標籤。爲什麼他們首先被禁用? – meagar 2010-09-02 20:56:13

+0

和可能重複[批處理腳本<?來取代PHP短開放標籤的PHP(http://stackoverflow.com/q/684587/367456) – hakre 2013-03-31 17:09:24

回答

4

轉換可以使用http://php.net/manual/en/function.token-get-all.php寫入。與find &替換不同,這不會影響XML聲明等。 轉換與啓用ST:這取決於。許多程序員可能更喜歡<?php到< ?,所以當你轉換時,你的代碼會更「標準」。但是,「標準」的重要性取決於具體情況。

1

您可以嘗試使用Eclipse PDT,使用它的搜索和替換所有的項目中(CTRL + H),以取代所有的短標籤與完整的標籤。

+0

或任何其他好的IDE,比如NetBeans的運行它們。 – slikts 2010-09-01 06:45:48

0

更改服務器配置可能會更快。我個人不會去搜索和替換,因爲儘管我更喜歡使用普通標籤,但這只是一個品味問題。與XML聲明衝突的短標籤不是一個嚴重的問題,因爲您可以將聲明放在字符串中。

3

對於其他人,KoolKabin指的是使用的<?代替<?php作爲PHP代碼開始標記,通常是在此縮寫形式使用:

<?= $myvar1, $myvar2 ?> 

即相當於此:

<? echo $myvar1, $myvar2 ?> 

其本身相當於此,當服務器所以用short_open_tag的值爲配置=上在php.ini:

<?php echo $myvar1, $myvar2 ?> 

就個人而言,我會轉換所有的短標籤,除非有許多頁面只有短標籤。

寫作各地token_get_all()一些代碼是你最安全的賭注(在這裏一個單獨的答案,我的細節),但你也許可以用一個簡單的脫身的sed腳本:

sed -e 's/<?\([ \t\r]\)/<?php\1/g' \ 
    -e 's/<?$/<?php/g' \ 
    -e 's/<?=\([ \t\r]\)\?/<?php echo \1/g' 

只是提防您的代碼中的字符串(特別是正則表達式),其中可能包含<?序列後跟空格字符。另請參閱:Useful one-line scripts for sed,其中指出sed語法各不相同,並且有些不支持\t代碼(但您可以鍵入實際的製表符)。

n.b.要注意的是sed的不使用Perl的正則表達式和對方回覆的至少一個在這裏已經無效sed的語法:例如\?在Perl是一種文字問號,但他打算?,這是一個文字問號在sed的。 (他還用<?php代替<?=,錯誤地忽略了「回聲」。)

0

絕對地重新定位標籤。

如果你的代碼是在Unix/Linux/POSIX事遂所願:

find ${BASEDIR} -iname \*.php -exec rep_sht_tags.sh {} \; 

其中rep_sht_tags.sh包含如下:

#!/bin/bash 

destdir=`dirname $1` 
mkdir -p /backup/${destdir} 

cp $1 /backup/$1 
sed 's/<\?=/<?php /' /backup/$1 >$1 

(NB未測試)

+0

「絕對重複使用標籤」您能否詳細說明您的推理? – meagar 2010-09-02 20:58:11

+0

短標籤由於充分的理由而被棄用 - 它們被用於其他目的 – symcbean 2010-09-03 11:16:33

+0

這就要辯論了。你什麼意思是「用於其他目的」? – meagar 2010-09-03 13:53:08

2

我看了更多,我修改了我以前的答案:「絕對地轉換它」。下面的PHP-CLI轉換器很容易。確保運行此係統的系統配置爲short_open_tag=on

#!php-cli 
<?php 
global $argv; 

$contents = file_get_contents($argv[1]) or die; 
$tokens = token_get_all($contents); 
$tokens[] = array(0x7E0F7E0F,"",-1); 

foreach($tokens as $ix => $token) { 
    if(is_array($token)) { 
    list($toktype, $src) = $token; 
    if ($toktype == T_OPEN_TAG) { 
     if (($src == "<?") && ($tokens[$ix+1][0] != T_STRING)) { 
     $src = "<?php"; 
     if ($tokens[$ix+1][0] != T_WHITESPACE) { 
      $src .= " "; 
     } 
     } 
    } 
    else if($toktype == T_OPEN_TAG_WITH_ECHO) { 
     $src = "<?php echo"; 
     if($tokens[$ix+1][0] != T_WHITESPACE) { 
     $src .= " "; 
     } 
    } 
    print $src; 
    } 
    else { 
    print $token; 
    } 
} 
+0

在我的博客上,我發佈了一個更完整的評論版本和一個選項來保留<?=標籤,只更改<?標籤: http://www.danielnorton.com/2010/09/1079/converter-to-replace-php-short-open-tags-shorttags-with-long-tags – danorton 2010-09-02 20:51:01