php.de

Zurück   php.de > Lösungen durch Skripte > Scriptbörse

Scriptbörse PHP Lösungen für nen schmalen Taler

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.07.2008, 20:15  
ElPresidente
Gast
 
Beiträge: n/a
Standard short_open_tag ersetzen

Hallo,
musste vor kurzem ein Projekt umstellen, da auf dem Live Server short_open_tag = off war. Suchen ersetzen geht leider nicht, da es natürlich Spezialfälle gibt, und seien sie noch so absurd:
<?phpinfo()?> sollte ebenfalls ersetzt werden, aber nicht in <?phpphpinfo()?>, sondern in <?php phpinfo()?>, weitere Spezialfälle wie XML-Deklarationen in PHP-Dateien <?='<?xml version="1.0"?>'?>, Kommentare, Kurzvarianten, ..

Hier das Skript, ist sogar relativ schnell, trotz allem vorher Backups machen:
PHP-Code:
<?php
function getPhpFiles($strBasePath$blnRecursive) {
    
$arrPhpFiles = array();
    foreach (
glob("$strBasePath/*") as $strFile) {
        if (
substr($strFile, -4) == ".php") {
            
$arrPhpFiles[] = $strFile;
        } else if (
$blnRecursive && is_dir($strFile)) {
            
$arrPhpFiles array_merge($arrPhpFilescall_user_func(__FUNCTION__$strFiletrue));
        }
    }
    return 
$arrPhpFiles;
}

function 
replaceShortOpenTag($strPhpFile) {
    
$arrToken   token_get_all(file_get_contents($strPhpFile));
    
$strContent "";
    
$intReplaced 0;
    for (
$i 0$x count($arrToken); $i $x; ++$i) {
        if (!
is_array($arrToken[$i])) {
            
$strContent .= $arrToken[$i];
        } else if (
$arrToken[$i][0] === T_OPEN_TAG_WITH_ECHO) {
            
$strContent .= "<?php echo ";
            ++
$intReplaced;
        } else if (
$arrToken[$i][0] === T_OPEN_TAG && strpos($arrToken[$i][1], "<?php") === false) {
            
$strContent .= "<?php";
            
$blnNextWhitespace = ($i $x)
                              && 
is_array($arrToken[$i 1])
                              && 
$arrToken[$i 1][0] === T_WHITESPACE;
            if (!
$blnNextWhitespace) {
                
// avoid that "<?require" (valid) becomes "<?phprequire" (invalid)
                
$strContent .= " ";
            }
            ++
$intReplaced;
        } else {
            
$strContent .= $arrToken[$i][1];
        }
    }
    if (
$intReplaced 0) {
        
file_put_contents($strPhpFile$strContent);
        
printf('<span style="color:red">[%02s] %s</span><br />'$intReplaced$strPhpFile);
    } else {
        
printf('[--] %s<br />'$strPhpFile);
    }
}

$strBasePath dirname(__FILE__);
$arrPhpFiles getPhpFiles($strBasePathtrue);
array_map("replaceShortOpenTag"$arrPhpFiles);
?>
example.php:
Code:
Some standard tests:

<? echo "1"; ?>
<?
echo "2"
?>

<?
    echo "3"
?>

<?echo "4"?>


<? if (!function_exists("info")) { function info() { eval("<?='info() called'?>"); } } ?>

call phpinfo():
<? phpinfo() ?>

call phpinfo():
<?phpinfo()?>

call info():
<?info() ?>

call phpinfo():
<?
phpinfo()
?>

<?/*<? echo "5" ?>*/?>

<?
/*
<? echo "6" ?>
*/
?>

<?
    /* <? echo "7" ?> */
?>


Probably just confusing for humans (throws E_NOTICE for undefined constant "php"):

<??><?php?><? ?><?php ?><?  ?><?php  ?>
<? // comment ?><?php // comment ?><? # comment ?><?php # comment ?>
<?;?>
<?
;
?>
<?
    ;
?>
<?;;;;?><?////?><?PHP_VERSION?>


What about the XML declaration?
<? echo '<?xml version="1.0"?>' ?>

<?='<?xml version="1.0"?>'?>


Nothing to do:
<?php echo "8" ?>

<?php
echo "9"
?>

<?php
    echo "10"
?>
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 30.07.2008, 20:59  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.992
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Hmm, ohne jetzt allzutief eingestiegen zu sein, wäre mein erster Ansatz gewesen:
regulärere Ausdruck: Alles was <?(.*), aber nicht <?php\s oder <?xml\s ist durch "<php $1" ersetzen.
Wie man mit Strings im Code verfährt wäre dann natürlich Ansichtssache.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online   Mit Zitat antworten
Alt 30.07.2008, 22:51  
ElPresidente
Gast
 
Beiträge: n/a
Standard

Mit dem Tokenizer ist man aber auf der sicheren Seite. Mir hat's beim normalen suchen/ersetzen etliche Dateien zerhaun, hab in Eclipse versehentlich 11.000 Funde mit dem falschen String ersetzt .. Sollte mit dem Skript nicht mehr passieren, einfach laufen lassen, set_time_limit(0) noch voransetzen, fertig. Natürlich wieder so ein Skript das man nur einmal im Leben braucht, aber dann sollte man es eben auch schnell über Google finden, dafür hab ichs reingestellt.
  Mit Zitat antworten
Alt 21.09.2009, 11:22  
Erfahrener Benutzer
 
Registriert seit: 28.11.2008
Beiträge: 160
PHP-Kenntnisse:
Fortgeschritten
McSodbrenner befindet sich auf einem aufstrebenden Ast
Standard

Aus aktuellem Anlass bringe ich diesen Thread mal wieder nach oben. In PHP 5.3 hat sich nämlich die Funktionalität des tokenizers zu PHP 5.2.x geändert... steht bloß nirgends.

Anscheinend ist der Tokenizer jetzt wirklich der, der intern auch von der Zend-Engine verwendet wird, da das Token "T_OPEN_TAG_WITH_ECHO" nur noch gefunden wird, wenn "short_open_tag = on". Ziemlich blöd, wenn man den Tokenizer zum Parsen von beliebigen PHP-Scripten verwendet, weil das Ergebnis immer von der eigenen Server-Einstellung abhängig ist.

Dieses Script hier würde also nicht mehr funktionieren. Kann die Änderung ja technisch nachvollziehen, aber finde sie nicht gerade sinnvoll.

Viele Grüße,
Christoph
McSodbrenner ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
String durchsuchen und ersetzen unabhängig von Groß / KLein PHP Tipps 2006 2 09.07.2006 23:29
geschachtelten array sortieren, enter ersetzen und umlaute moose PHP Tipps 2006 5 20.04.2006 12:24
String ersetzen Benshee PHP Tipps 2006 4 02.04.2006 21:43
MySql: Suchen und ersetzen Problem faragerri Datenbanken 5 02.03.2006 15:20
Problem mit der preg_replace - Ersetzen einer Zeichenkette reimondo PHP Tipps 2006 10 07.02.2006 22:36
Anführungszeichen ersetzen PHP Tipps 2005-2 6 28.09.2005 20:39
Session ersetzen duderino PHP Tipps 2005-2 14 21.09.2005 15:27
unbekannten teilstring mit anfang/end-markierung ersetzen janni PHP Tipps 2005 14 29.04.2005 14:53
Suchen - Ersetzen PHP Tipps 2005 4 16.04.2005 22:40
Text in datei ersetzen und dann wieder speichern Ypsillon PHP Tipps 2005 2 19.02.2005 15:26
regulärer Ausdruck zum dynamischen ersetzen in einem templat robo47 PHP Tipps 2004 3 02.11.2004 08:25
[Erledigt] includ. Text ersetzen ohne vars PHP Tipps 2004 3 13.09.2004 23:16
templatesystem - variables ersetzen konsti PHP-Fortgeschrittene 6 07.08.2004 10:56
[Erledigt] RegExp: Dynamisches Ersetzen PHP-Fortgeschrittene 5 23.07.2004 13:39
Reguläre Ausdrücke beim suchen und ersetzen Off-Topic Diskussionen 5 05.07.2004 15:35

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php short_open_tag, short_open_tag, short_open_tag php, short_open_tag on, short_open_tag is off, xampp short_open_tag, short_open_tag = on, php short_open_tags, short_open_tag off, short_open_tag xampp, short_open_tag = off, short_open_tag=on, xampp short_open_tags, short_open_tag php 5.3, php short_open_tag on, was ist short_open_tag, php short_open_tag = on, php short_open_tag funktioniert nicht, short_open_tag., php \short_open_tag\

Alle Zeitangaben in WEZ +2. Es ist jetzt 23:24 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum