PHP: регулярное выражение для соответствия следующим образцам строк - PullRequest
1 голос
/ 03 июля 2011

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

<?php

    if ( !empty( $_GET['gamertag'] ) )
    {

        require_once( 'xbox.php' );
        header( 'Content-Type: image/png' );

        // Content
        $xbox = new Xbox( $_GET['gamertag'] );
        $font = 'fonts/helr65w.ttf';

        // Images
        $bg = @imagecreatefrompng( 'content/gamercard.png' );
        $gp = @imagecreatefrompng( $xbox->Links['GamerPicture'] );
        $st = @imagecreatefrompng( 'content/star.png' );
        $re = Array();

        if ( $xbox->CanViewGames() )
        {

            foreach( $xbox->RecentGames as $key => $value )
                $re[] = @imagecreatefromjpeg( $value['Image'] );

        }

        // Save Transparency
        @imagesavealpha( $bg, true ); 
        @imagealphablending( $bg, false ); 
        @imagecolorallocatealpha( $bg, 255, 255, 255, 127 );
        @imagealphablending( $bg, true );

        // Create Colors
        $white = @imagecolorallocate( $bg, 255, 255, 255 );
        $grey = @imagecolorallocate( $bg, 128, 128, 128 );
        $black = @imagecolorallocate( $bg, 0, 0, 0 );
        $orange = @imagecolorallocate( $bg, 233, 171, 23 );

        // Write Information

        for( $i = 0; $i < count( $re ); $i++ ) // Recent Games
            @imagecopy( $bg, $re[$i], ( 100 + ( 40 * $i ) ), 44, 0, 0, 32, 32 );

        for( $r = 0; $r < $xbox->Reputation; $r++ ) // Reputation
            @imagecopy( $bg, $st, ( 196 + ( $r * 20 ) ), 125, 0, 0, 16, 16 );

        @imagecopy( $bg, $gp, 18, 55, 0, 0, 64, 64 );
        @imagettftext( $bg, 14, 0, 40, 30, $black, $font, $xbox->Gamertag );
        @imagettftext( $bg, 14, 0, 143, 105, $black, $font, $xbox->Gamerscore );
        @imagettftext( $bg, 6, 0, 7, 161, $black, $font, $xbox->CurrentActivity );
        @imagepng( $bg );

        // Destroy Images
        @imagedestroy( $bg );
        @imagedestroy( $gp );
        @imagedestroy( $st );

        foreach( $re as $game )
            @imagedestroy( $game );

    }
    else
    {

        print( '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

    <head>

        <title>Xbox Gamercard</title>

        <script type="text/javascript">

            function go()
            {

                var gamertag = document.getElementById( "gamertag" ).value;
                window.location.href = ( gamertag + ".png" );

            }

        </script>

    </head>

    <body>

        <input type="text" id="gamertag" onkeydown="if (event.keyCode == 13) go();" />
        <input type="button" value="Submit" onclick="go();" /><br /><br />

        <a href="/projects/xbox-gamercard/ttg/" title="TTG Signature Gamercard">TTG Signature Gamercard</a>

    </body>

</html>' );

    }

?>

Я ищу выражение, которое можетУспешное сопоставление всего содержимого между '' и "".

Необходимо игнорировать все (правильно) экранированные версии самих себя.(Таким образом, содержимое между '' будет игнорировать \', а содержимое между "" будет игнорировать \")

Не имеет значения, какой из них будет первым.

Вот два выражения, которые я уже пробовал:

"/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*?'/"
"/'(.[^']*)'/"

1 Ответ

0 голосов
/ 03 июля 2011

Попробуйте это необработанное регулярное выражение.Группа 2 будет содержать ваши строки.

(['"])((?:\\\1|(?!\1).)+)\1

Поскольку PHP не является моим языком, я не уверен, что избежал его правильно, но попробуйте следующее:

$pattern = '/([\'"])((?:\\\\\\1|(?!\\1).)+)\\1/';

Этот код не будет соответствующим образом отлавливать закомментированный код, дляпример:

// ' my string does not get terminated.
...