Многоредов проблем с PHP Tokenizer

Използвам token_get_all за разработване на инструмент. Заседнал съм в ситуация, в която имам следната заявка в php кода

$sql = "UPDATE `key_values` SET
                `Value_Content` = '" . $this->db->escape($revisionValues['value']) . "',
                `Comments` = '" . $this->db->escape($revisionValues['comment']) . "',
                `Is_Active` = '" . $this->db->escape($revisionValues['actstate']) . "',
                `Is_Modified`='1'
                WHERE
                `Key_Value`='" . $candidateKey['key'] . "'
                AND `Email_Template`='" . $candidateKey['template'] . "'
                AND `Locale_ID`='" . $candidateKey['locale'] . "'";

и друг код

$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

Искам да третирам това като един ред. Не мога да открия края на реда в многоредов код, както беше споменато по-горе. Има ли начин да се открие. Имам нужда от някакъв идентификатор, който да ми казва, че тази многоредова sql заявка е един ред за php.


person user1635914    schedule 18.12.2012    source източник
comment
Не съм 100% сигурен за въпроса ви, но ако просто имате нужда от нещо, което да ви направи по-ясно, за да прочетете, защо не използвате <<<EOF и EOF   -  person PhearOfRayne    schedule 18.12.2012


Отговори (1)


Вие правите едно изявление, в което сами декларирате нови редове. Така че вашата променлива съдържа нови редове, защото сте ги поставили там. Сега имате две възможности:

1: Не поставяйте новите редове

$sql = "UPDATE `key_values` SET ".
            "`Value_Content` = '" . $this->db->escape($revisionValues['value']) . "', ".
            "`Comments` = '" . $this->db->escape($revisionValues['comment']) . "', ".
            "`Is_Active` = '" . $this->db->escape($revisionValues['actstate']) . "', ".
            "`Is_Modified`='1' ".
            "WHERE ".
            "`Key_Value`='" . $candidateKey['key'] . "' ".
            "AND `Email_Template`='" . $candidateKey['template'] . "' ".
            "AND `Locale_ID`='" . $candidateKey['locale'] . "'";

2: премахнете ги след това

$sql = "UPDATE `key_values` SET
            `Value_Content` = '" . $this->db->escape($revisionValues['value']) . "',
            `Comments` = '" . $this->db->escape($revisionValues['comment']) . "',
            `Is_Active` = '" . $this->db->escape($revisionValues['actstate']) . "',
            `Is_Modified`='1'
            WHERE
            `Key_Value`='" . $candidateKey['key'] . "'
            AND `Email_Template`='" . $candidateKey['template'] . "'
            AND `Locale_ID`='" . $candidateKey['locale'] . "'";
$sql = str_replace(array(chr(10), chr(13)), '', $sql);

Така че откриването на нов ред е проверка за chr(10) или chr(13). В зависимост от това на каква система работите, може да е един от тях или и двата. Вижте: Нов ред = \n ИЛИ \r\n ли е? (\r=chr(13) & \n=chr(10))

АКТУАЛИЗИРАНЕ

Ако искате да върнете низ от един ред от token_get_all(), можете да използвате:

<?php
$c = str_replace(array("\n","\r"), '', print_r(token_get_all('<?php echo; ?>'), true));
print $c;
// token_get_all() returns an array
// print_r(array, true) prints the array and the true param makes it return the output as a string
// replace the newline chars with nothing to make it single line

//single line output:
//Array( [0] => Array ( [0] => 372 [1] => 1 ) [1] => Array ( [0] => 316 [1] => echo [2] => 1 ) [2] => ; [3] => Array ( [0] => 375 [1] => [2] => 1 ) [4] => Array ( [0] => 374 [1] => ?> [2] => 1 ))
?>
person Hugo Delsing    schedule 18.12.2012
comment
Това не е само моят код. Има много разработчици, така че първата опция не е решение за мен. За втория, всъщност това е моята гледна точка, как да идентифицирам, че този ред е многоредов, така че да мога да премахна chr(10), chr(13). - person user1635914; 18.12.2012
comment
Ако искате да го идентифицирате, можете да използвате substr_count или strpos, за да видите дали връща ›0 (или ›=0 за strpos) на chr(10) или chr(13). Но можете също така просто да го замените веднага. Ако вече е бил един ред, няма да промени нищо, а ако е бил многоред, ще го промени на един ред - person Hugo Delsing; 18.12.2012
comment
Хюго как ще получите пълна линия чрез token_get_all. Не получавам тази част...... - person user1635914; 18.12.2012
comment
Благодаря, имам файл, който съдържа php код, включително тази заявка и масив. Пуснах същото на него и все още получавам заявка в множество токени, а не като един ред. Вашето решение ще работи, след като имам пълна заявка в ръка като един ред. И това не се случва. освен това $c във вашия код трябва да е sting, където имам нужда от array. - person user1635914; 18.12.2012
comment
Тогава нямам представа какво искаш да направиш. - person Hugo Delsing; 18.12.2012