Но этот метод не будет обнаружить такую ошибку:
Потому что подсчет делает если вы хотите проверить, существует ли равное количество открывающих и закрывающих скобок. Но если вы хотите быть добрым к своему пользователю и указать на место, которое он допустил ошибку, то подсчета будет недостаточно, и вы должны использовать, то есть стек (даже на основе массива на основе array_push()
и array_pop()
). С помощью стека вы перебираете строку и нажимаете токен, когда вы сталкиваетесь с открывающей скобкой <
и вытаскиваете токен, когда вы нажимаете на закрытие >
. В вашем случае:
This is >b<BOLD>/b< word
вы должны сделать pop
, как первый является >
, но нет ничего в стек, это вызывает ошибку. Давайте исправим эту скобу и продолжить:
This is <b<BOLD>/b< word
и запустить
push -> ok
push -> well if you allow nested brackets, then all is ok, otherwise
stack must be empty prior pushing so this bracket is misplaced
and you shall throw an error
и так далее ... и как только вы достигнете конца строки и ваш стек не пуст, то вы знаете, в последний раз замечен <
промаха его пара >
(Если вы разрешаете вложение скобок, то логика, необходимая для указания того, какой из них потенциально не закрыт, может быть более сложной и иногда давать ложные результаты (например, иногда компиляторы делают в подобном случае)).
Если вы не планируете, чтобы вложенные скобки, то вы можете сделать ваш код еще проще, так как при использовании обычной integer
переменной для индикации состояния будет достаточно (т.е. «0» для <
, 1
для >
и -1
для начального состояния)
html? то вы можете попробовать следующее: http://stackoverflow.com/questions/3167074/which-function-in-php-validate-if-the-string-is-valid-html – jbe
Пожалуйста, проверьте ответы и подумайте о том, чтобы принять тот, который работает лучше всего для вас/повышая эффективность тех, которые вы найдете полезными. Или дайте дополнительные разъяснения в теле вашего вопроса. –