Тестирование на обратную косую черту в строке - PullRequest
1 голос
/ 19 декабря 2010

Итак, я пишу скрипт PHP, который будет читать в файле CSS, а затем помещать комментарии и фактический CSS в отдельные массивы. Затем скрипт создаст страницу с CSS и все комментарии будут отформатированы.

Основная логика для сценария такова:

  • Читать в новой строке
  • Если начинается с косой черты или заканчивается открывающей скобкой, установите bool для CSS или комментарии к true
  • Добавьте эту строку в соответствующий элемент в соответствующем массиве
  • Если последний символ является обратной косой чертой (конец комментария) или первый символ является закрывающей скобкой (конец CSS-тега), установите необходимое значение bool в ложь
  • Промыть, повторить

Если кто-то видит в этом ошибку, не стесняйтесь указывать на нее, но я думаю, что она должна делать то, что я хочу.

Сложная часть - это последний оператор if, проверяющий, является ли последний символ обратной косой чертой. Прямо сейчас у меня есть:

if ($line{(strlen($line) - 3)} == "\\") {do stuff}

где $ line - последняя строка, прочитанная из файла. Не совсем уверен, почему мне нужно возвращаться назад на 3 символа, но я предполагаю, что это потому, что в конце каждой строки при чтении из файла есть новая строка. Тем не менее, это утверждение if никогда не соответствует действительности, даже если есть строки, заканчивающиеся косой чертой. Это

echo "<br />str - 3: " . $line{(strlen($line)-3)};

даже возвращает обратную косую черту, но оператор if никогда не срабатывает.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2010

@ mcritelli: комментарии CSS выглядят как /* comment */, поэтому простой поиск обратной косой черты не скажет вам, начинается или заканчивается комментарий.Вот очень простой скрипт, который я тестировал, который проходит через «строку» и может что-то делать в начале и в конце комментария -

<?php
$line  = "/* test rule */";
$line .= ".test1 { ";
$line .= "  text-decoration: none; ";
$line .= "}/* end of test rule */";

for ($i = 0; $i < strlen($line); $i++) 
{
    if ($line[$i] . $line[$i + 1] == "/*")
    {
        // start of a comment, do something
    }
    elseif ($line[$i] . $line[$i + 1] == "*/")
    {
        // end of a comment, do something
    }
}
?>
0 голосов
/ 19 декабря 2010

Это было бы потому, что $ line {(strlen ($ line) - 3)} в вашем операторе if возвращает один обратный слеш, а оператор if ищет два. Попробуйте использовать

substr($line, -2)

вместо этого. (Возможно, вам придется изменить его на -3. Причина этого в том, что символ новой строки может быть включен в конец строки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...