Многострочная проблема с 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.

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 ))
?>
Другие вопросы по тегам