Nests validation

Yurik

/dev/null
Nests validation

Подскажите алгоритм как проверить строку на наличие перекрестных тегов, вот так
PHP:
[тег1]
....
[тег2]
[/тег2]
....
[/тег1]
чтобы работало, а
PHP:
[тег1]
....
[тег2]
[/тег1]
....
[/тег2]
выводило ошибку. Список тегов заранее определен (3-4 шт.)
 

Eugene Bond

sudo rm - rf /
Рекурсивно гонять это дело.
Функция ищет закрывающий тэг, который передается параметром. Если находит открывающий - вызывает себя с новым параметром
 

Yuriy_S

-=PHP-Club=-
регулярным выражением можно проверить
PHP:
$str2="[тег1]lrkusj[тег2]sdff[/тег2]ssdf[/тег1]";
if(preg_match("/(\[тег1\]).*(\[тег2\]).*(\[\/тег2\]).*(\[\/тег1\])/i", $str2, $pr)){
echo "ok";
}
else {
echo "no";
}

p.s - при условии, что список тегов заранее определен.
 

Yurik

/dev/null
Так?
1. Находим первый попавший тег и его позицию
2. Передаем этот тег и его позицию в функцию
3. В функции ищем тег-пару с переданной позиции
4. Если находим другой закрывающий тег, делаем return false;
5. Если находим закрывающий тег-пару - return true;
6. Если находим другой открывающий тег - вызываем себя с эитм тегом и его позицией.
7. Если хоть раз вернулся return false - ошибка
 

Yurik

/dev/null
>регулярным выражением можно проверить
но тегов может и вообще не быть, или быть в любом порядке и количестве
 

Yuriy_S

-=PHP-Club=-
Тогда стой функцию как сказал Eugene Bond, и проверяй рег. выражениями на парность тегов, что бы после открывающего шел закрывающий и т.д.
Только вот с внутренними тегами будет сложнее.
 

Yurik

/dev/null
появилась другая идея (рекурсия не нравится мне)

1. Нашел тег - запхал его в массив
2. Нашел еще один тег - запхал его в массив
3. Нашел закрывающий тег - взял последний из массива и сравнил. Если совпали - стер последний из массива. Если не совпали - ERROR.
 

Crazy

Developer
Сканируем текст. Если встретили открвающий тэг -- кладем его в стек. Если встретили закрывающий -- снимаем тэг со стека и сравниваем. Не совпали -- ошибка.

Как сделать стэкт в PHP -- очевидно.
 
Сверху