Всем доброго дня. В общем нужен скрипт который открывает php файл и проверяет наличие закрывающих скобок, так же он должен выдавать номер строки с ошибкой и кол-во таких строк. Пока что собрал вот такой кусок, как сделать чтобы был вывод строк с ошибками? Код (PHP): function php_check_syntax ($delievery){ @$code = file_get_contents($delievery) if ($code == false) { throw new Exception('File '.$delievery.' does not exist'); } // первый этап проверки $braces = 0; $inString = 0; foreach ( token_get_all($code) as $token ) { if ( is_array($token) ) { switch ($token[0]) { case T_CURLY_OPEN: case T_DOLLAR_OPEN_CURLY_BRACES: case T_START_HEREDOC: ++$inString; break; case T_END_HEREDOC: --$inString; break; } } else if ($inString & 1) { switch ($token) { case '`': case '"': --$inString; break; } } else { switch ($token) { case '`': case '"': ++$inString; break; case '{': ++$braces; break; case '}': if ($inString) { --$inString; } else { --$braces; if ($braces < 0) { throw new Exception('Braces problem!'); } } break; } } } if ($braces) { throw new Exception('Braces problem!'); } $res = false; Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
Не думаю что преподу понравиться такой поворот. Возможно как-то можно значительно сократить код с помощью регулярных выражений?
можно сократить с помощью php =) но препод поймёт, что это не твоё решение. Но я тебе дам подсказку, найдёшь - молодец. Пхп умеет понимать и разбирать пхп.
Это круто, но, боюсь, задача не преследует целью именно разбор пхп у парня. Препод увидит решение такое и скажет "окей, тогда не пхп, пусть будет *.срр файл". Это модификация классической задачи со скобками из разряда задач на разбор выражений/работы с текстом, не более.
strpos() быстрее. У вас какая-то неимоверная логика для тривиальной задачи. Читаете текст. Встретили в строке открывающий символ - записали в массив номер строки. Встретили закрывающий - удалили последнюю запись. Нет в массиве открытых скобок? - Записали ошибку в лог. По окончании вывели массив незакрытых скобок и закрывающих без открытых. Никаких экспешенов там не надо. Если надо, то можно использовать стандартный вывод ошибок самого интерпритатора.
У него там логика учитывает то, что скобочка может находиться, например, внутри строки или SQL_запроса. Хоть автор вряд ли в курсе, потому что код скопипижжен из коммента в документации пыхи. Причем из коммента 8-летней давности, ойвей. Пруф - https://php.net/manual/ru/function.php-check-syntax.php#80627 Причем скопипижжен, походу, немного через "сломанный телефон". Вряд ли автор в курсе первоисточника. И да, Автор, препод, как я, вобьет кусок кода в гугл и погонит вас метлой из аудитории.
Это не сработает, если речь идет не только о фигурных, но и об обычных скобках. Потому что пропустит конструкцию { ( } ) Которая не может быть валидной. Они тоже ломают синтаксис на ура. И это тоже классическая ошибка в решении классической задачи Такие вещи делаются через стек. Встретили открывающую скобку любого типа - "положили ее в стек". Встретили закрывающую скобку любого типа, обратились к стеку, вытряхнули из него скобочку последнюю, проверили. Если она 1) Того же типа, что и встреченная 2) Открывающая То все в порядке, идем дальше. В стеке больше этой скобки нет, она вытряхнута. Если хоть одно условие не совпадает, либо стек пуст - прекращаем разбор, ибо ошибка.
Ну и хрен с ним. Есть кейсы когда эта скобка должна быть не закрыта разве в тексте? where like '{%' какой-нибудь разве что намеренно кривой. Тут можно сказать: как прописано условие задачи, такое и решение.
Прекрасно. Есть в условии задачи что учитываем только синтаксические скобки интерпрЕтатора (двоечник я)? Нет, у тса не увидел. В решении - да увидел.
стек это прикольно. Вот у Феррары пол года смотрю на его статью про разбивку на токены http://blog.ircmaxell.com/2015/05/tries-and-lexers.html и думаю надо ли мне это знать Добавлено спустя 46 секунд: всё, пизда, надо преподу пузырь заносить чо
Но если чисто бежать по скрипту без учета строковых данных, то получится, что открывающих на одну больше, чем закрывающих. По этому там ведется учет кавычек и апострофов в посте. Но все равно через задницу сделано и неправильно. Будет ошибаться, как я выше описал. Собсно, и коммент, на который я сослался, заминусован.
Мб. Но, на самом деле, даже если учесть { в сраных кавычках, исключение их через strpos или регулярками быстрее сработает. Дальше сейчас они напишут про { в комментариях...
Такида. Ну правда, если бы речь была просто о проверке любой строки на скобочки, то тогда да. А так - скобочки скобочкам рознь. Нужно проверить код как код, а не как текст. Добавлено спустя 3 минуты 3 секунды: Но, даже проверка комментов/проверка строк/проверка запросов реализуется крайне крайне просто и тез гемора. Проблемы как таковой в этом нет вооообще. Та же задача на стек, но чуть поправленная. Но я принципиально не буду решение автору давать. Пусть учится. Работать за него тоже никто не будет. Достаточно того, что основной принцип описан. Добавлено спустя 8 минут 48 секунд: З.Ы. Так-то никто не против strpos'а. Через него бежать по коду всяко быстрее, чем посимвольно жевать. Это никто и не оспаривает.
Нет, думаю igordata здесь был прав потому что по заданию у меня файл пхп с 4 пропущенными закрывающими кавычками и только в коде, нужно лишь чтобы скрип вывел номер строк где они пропущены и что их 4 . За strpos отдельное спасибо! Это шайсе надо сделать к завтра, но думаю что справлюсь =)
Ну тогда там решение в одну строку. Буквально. Но, боюсь, препод закозлится, мол "я не это имел ввиду".
Небольшое уточнение, ф-ия strpos проверяет вхождения, но как она может отметить скобки с отсутствующими парами?
Никак. Ты программист или где? Алгоритмизируй. Если ты про "пхп умеет проверять пхп", то ты ищешь не там.
Вот к чему пришел, но теперь нужно сделать так чтобы вывело общее кол-во незакрытых строчек, Код (PHP): <? $str = @file_get_contents('delivery.php') ; if($str === FALSE) { echo 'Such file was not found';} else { $arr = explode(' ', $str); foreach ($arr as $nomStr => $text){ $left = explode('{',$text); if(count($left)>=2){ for($i=1;$i<count($left);$i++){ echo '<strong style="color: #009900">braces "{" in string '.($nomStr+1).'</strong>'; echo '<br>'; } unset($left); } $bad = explode('}',$text); if(count($bad)>=2){ for($i=1;$i<count($bad);$i++){ echo '<strong style="color:#FF0000">braces "}" in string'.($nomStr+1).'</strong>'; echo '<br>'; } unset($bad); } } } ?>
Индусский код, бро. Код (PHP): if (file_exists('delivery.php')){ //работа с файлом. } О_О Бро, решение нереальнейше индусское. Плевать, что не расширяемое, плевать что топорное, но индуизм - это эребор. В чем проблема сделать через стек-то? Длина стека к концу работы - количество скобочек. Ты делаешь просто по замеру количества, без учета порядка, ок. Тогда просто вычитай длины...массивов финальных и бери результат по модулю. Но, е-мое, генерить массивы - это эребор. Я б на месте препода охренел, увидев такое.