powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Проверка открывающих и закрывающих тегов
33 сообщений из 33, показаны все 2 страниц
(PHP) Проверка открывающих и закрывающих тегов
    #33587749
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите, а как проверить в хтмл коде, равняется ли число открывающих тегов числу закрывающих? Причем ведь у некоторых тегов нет закрывающих, например <img> Извините, регекспы еще не освоил *shy*
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33587771
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теги без закрывашки в соответствии с XHTML должны писаться так <tagname param1=val1 param2=val2/>. Если это правило соблюдено, то можно просто проферить XML-документ на валидность.
Можно пошаманить с регулярными выражениями.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33593956
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как это проверить на валидность? И как лучше? Проверить на xml валидность или шаманить с регекспами?
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33594871
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эту задачу разработчики некоторых браузеров тоже не знают как решать :)

Ну, в общем случае тебе нужен список тэгов, которым обязательно нужны замыкающие. Состав тэгов любой, например table, tr и td.

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

Правда, такой механизм не справится с "валидным" html вида

<i>превед <b>кросавчег</i></b>



Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33595039
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ммм... а попроще как-нибудь? Ведь нам просто надо посчитать число подстрок типа "<...>" и число подстрок типа "</...>" Где "..." - теги, для которых обязательны закрывающие. Причем реально мне нужно всего несколько - в основном открывающие и закрывающие теги <table>, ячейки (допустим что теги <tr> и <td> тоже требуют обязательного закрытия) и т.д. Не поможете с регулярными выражениями?
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33595054
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вроде самый простой механизм я расписал...

Лично мне кажется, что разбор регэкспами будет сильно медленней.

Счас попробую набросать фнукцию checkTags


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33595072
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начнем, помолясь.

Вот "рыба", к кторой можно уже писать тесты.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
/**
 * Проверка текста на предмет совпадения открывающих и закрывающих тэгов
 *
 * @param string $txt    Текст для разбора
 * @param array  $tags   Массив, описывающий состав и начертание
 *                       открывающих и закрывающих тэгов
 *                           array(
 *                               'tag name' =>
 *                                   array(
 *                                       'open'  => '<tag>'
 *                                     , 'close' => '</tag>'
 *                                   )
 *                             ...
 *                           )
 *                            
 * @return array         Массив, рписывающий результат разбора
 *                           array(
 *                               'result' => true | false
 *                               'reason' => description of problem
 *                           )
 *    
 *                           Параметр 'result':
 *                               0     - количество и порядок
 *                                       закрывающих тэгов
 *                                       соответствует количеству
 *                                       и порядку открывающих тэгов
 *                               1     - ошибка несоответствия тэгов
 *                               2     - ошибка во входных параметрах
 *
 *                           Параметр 'reason':
 *                               текстовое описание ошибки
 *
**/
function checksTags( $txt, $tags ) {


    // Проверка входных параметров
    $result = array(
        'result' => false
      , 'reason' => 'ошибка во входных параметрах'
    );
    foreach( $tags as $t => $v ) {
        if(
               empty( $v['open'] )
            || empty( $v['close'] )
        ) {
            return $result;
        }
    }


    // Разбор входного текста
    $result_false = array(
        'result' => false
      , 'reason' => 'несоответствие тэгов'
    );

    $result_true = array(
        'result' => true
      , 'reason' => 'тэги соответствуют'
    );
   
    // Вырожденный случай - just for test
    if( strlen($txt) ==  0  ) {
        return $result_true;
    }





    return $result_false;
    
} // function chackTags()

Теперь напишем тесты и двинемся дальше


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33595155
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извини, отвлекся на домашние дела.

Итак, код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
/**
 * Проверка текста на предмет совпадения открывающих и закрывающих тэгов
 *
 * @param string $txt    Текст для разбора
 * @param array  $tags   Массив, описывающий состав и начертание
 *                       открывающих и закрывающих тэгов
 *                           array(
 *                               'tag name' =>
 *                                   array(
 *                                       'open'  => '<tag>'
 *                                     , 'close' => '</tag>'
 *                                   )
 *                             ...
 *                           )
 *                            
 * @return array         Массив, рписывающий результат разбора
 *                           array(
 *                               'result' => true | false
 *                               'reason' => description of problem
 *                           )
 *    
 *                           Параметр 'result':
 *                               0     - количество и порядок
 *                                       закрывающих тэгов
 *                                       соответствует количеству
 *                                       и порядку открывающих тэгов
 *                               1     - ошибка несоответствия тэгов
 *                               2     - ошибка во входных параметрах
 *
 *                           Параметр 'reason':
 *                               текстовое описание ошибки
 *
**/
function checksTags( $txt, $tags ) {

    //
    // Возможные результаты
    //

    $result_true = array(
        'result' => true
      , 'reason' => 'тэги соответствуют'
    );
    $result_false_match = array(
        'result' => false
      , 'reason' => 'несоответствие тэгов'
    );
    $result_false_pars = array(
        'result' => false
      , 'reason' => 'ошибка во входных параметрах'
    );

    //
    // Проверка входных параметров
    //

    $regexp = '/\.*';
    $re     = array();
    $search = array();
    foreach( $tags as $t => $v ) {

        // Обязательные элементы массива параметров
        if( empty( $v['open'] ) || empty( $v['close'] ) ) {
            return $result_false_pars;
        }

        // Попутно собираем термы в один регэксп
        $re[] = addcslashes($v['open'].'|'.$v['close'], '/');

        // Попутно формируем массив разбора -
        // ключ - открывающий тэг, значение - закрыващий
        if( !empty($search[$v['open']]) ) {

            // Не допускаются совпадения открывающих тэгов
            return $result_false_pars;

        }

        $search[$v['open']] = $v['close'];

    }
    $regexp .= join( '|', $re ).'/';

    //
    // Разбор входного текста
    //

    // Вырожденный случай - just for test
    if( strlen($txt) ==  0  ) {
        return $result_true;
    }

    // Формируем массив разбора
    preg_match_all( $regexp, $txt, $out );
    $out = $out[ 0 ];

    // Разбираем массив с помощью стека
    $stack = array();
    foreach( $out as $tag ) {

        if( isset( $search[ $tag ] ) ) {

            // Открывающий тэг - пишем в стек
            // соответствующий закрывающий тэг
            $stack[] = $search[ $tag ];

        } else {

            // Закрывающий тэг - извлекаем
            // и проверяем последний элемент стека
            if( array_pop( $stack ) != $tag ) {
                return $result_false_match;
            }

        }

    }

    // Если стек после разбора непуст -
    // налицо несоответствие тэгов
    if( count( $stack ) >  0  ) {
        return $result_false_match;
    }

    // Все условия выполнены, тэги соответствуют
    return $result_true;
    
} // function chackTags()

Тесты не привожу - оставляю как упражнение. Постарайся сделать их сам.

Как сделаешь - выкладывай, сравним :)


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33597858
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо ОГРОМНОЕ, работает на ура!!!! =)
Код: plaintext
1.
2.
3.
$text="<table align=\"center\"><tr><td>cell01</td><td>cell02</td></tr>"; //OK
$text2="<table align=\"center\"><tr><td>cell01</td><td>cell02</tr>"; //несоответствие тегов
$text3="<table bgcolor=white align=center width=100% cellspacing=5 cellpadding=0 border=0 ><tr><td align=left><table width=50% bgcolor=#BBEEEE height=100%><tr><td style=\"color:#015C5C\">GGG</td></tr></table></td></tr><tr><td align=left style=\"color:#015C5C;font-size:11px;font-family:sans-serif\">AAA</td></tr><tr><td align=right><a href=http://site.com/user><table bgcolor=#99CCCC>qwerty</table></a></td></tr><tr><td height=5px bgcolor=#BBEEEE></td></tr></table>";
А я и не знал что в php тоже можно организовать стек Это массив, как я вижу, только как-то по особому с ним работают... Я со стеком пока сталкивался тока в pascal/Delphi, реализация динамическим списком.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33598002
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
DipishА я и не знал что в php тоже можно организовать стек Стек можно организовать в любом языке программирования. Если в нём есть массивы. Учите матчасть, вьюноша.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33598127
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Учу! Точнее учусь! =) Не судите строго, 1 курс ^_^
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33599506
1024byte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* DipishА я и не знал что в php тоже можно организовать стек Стек можно организовать в любом языке программирования. Если в нём есть массивы. Учите матчасть, вьюноша.
вьюноша учитесь сами, стек можно реализовать на любом языке программирования (ну возможно существуют какие-то совсем извратные), и _массивы_ тут не при чем.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33599917
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
1024byteвьюноша учитесь сами, стек можно реализовать на любом языке программирования (ну возможно существуют какие-то совсем извратные), и _массивы_ тут не при чем.Вьюноша, учите булеву алгебру.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33599924
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
Если не дошло - то фразу надо читать как "если в A есть B, то C - возможно".
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33599954
1024byte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сам то понял что сказал ?
учитель ёлки палки.
наличие массивов не является обязательным (и тем более необходимым) требованием для реализации списков.

короче, закрывайте топик, дальше только флуд.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33600900
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
1024byteналичие массивов не является обязательным (и тем более необходимым) требованием для реализации списков.А я что сказал? Ну слава богу, хоть дошло...
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33600901
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
Достаточным оно является.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33610498
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что делать если у тега есть атрибуты? Тогда эта функция будет говорить что теги несоответствуют! =(
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33611382
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если покопать в таком направлении:

тынц тынц и тынц

ващет ПХП не очень люблю но зачем изобретать велосипед, почему не поискать готовые решения?
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33611654
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут специфичные нужды... К тому же функция уже есть, тока надо сделать чтобы она корректно работала для тегов с аттрибутами.
Я пробовал впихивать регексп в открывающие теги типа
Код: plaintext
<table (.*)> или <table .*>
Но чего-то не получается... Я тока начинаю изучать регулярные выражения, подскажите плз что я упустил!
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33612320
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня есть кусок на перле для тегов с атрибутами в виде регекспа -- сразу скажу там регексп рекурсивный, чтото меня терзают смутные сомненья насчет того подойдет ли он вам если хотите могу на перле код привести
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33612486
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нет мыслей как модифицировать написанную функцию? ap99ap помогите пожалуйста! =)
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33612611
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сами тэги нужно определять так:

<table[^>]*>
<tr[^>]*>
<td[^>]*>

И все, в функции ничего менять не нужно.


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33615642
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не работает ;-(
Код: plaintext
"<table>ggg</table>" //несоответствие!!

Код: plaintext
"<table>ggg" //несоответствие
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33618553
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну да. Там же строится массив соответствий по содержимому тэгов.

Счас, дай подумать...


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33618597
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изящно не получается.
Нужна принципиально новая идея.

Тупо и в лоб делается вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
/**
 * Проверка текста на предмет совпадения открывающих и закрывающих тэгов
 *
 * @param string $txt    Текст для разбора
 * @param array  $tags   Массив, описывающий состав и начертание
 *                       открывающих и закрывающих тэгов
 *                           array(
 *                               'tag name' =>
 *                                   array(
 *                                       'open'  => '<tag>'
 *                                     , 'close' => '</tag>'
 *                                   )
 *                             ...
 *                           )
 *
 * @return array         Массив, рписывающий результат разбора
 *                           array(
 *                               'result' => true | false
 *                               'reason' => description of problem
 *                           )
 *
 *                           Параметр 'result':
 *                               0     - количество и порядок
 *                                       закрывающих тэгов
 *                                       соответствует количеству
 *                                       и порядку открывающих тэгов
 *                               1     - ошибка несоответствия тэгов
 *                               2     - ошибка во входных параметрах
 *
 *                           Параметр 'reason':
 *                               текстовое описание ошибки
 *
**/
function checkTags( $txt, $tags ) {

    //
    // Возможные результаты
    //

    $result_true = array(
        'result' => true
      , 'reason' => 'тэги соответствуют'
    );
    $result_false_match = array(
        'result' => false
      , 'reason' => 'несоответствие тэгов'
    );
    $result_false_pars = array(
        'result' => false
      , 'reason' => 'ошибка во входных параметрах'
    );

    //
    // Проверка входных параметров
    //

    $regexp = '/\.*';
    $re     = array();
    $search = array();
    foreach( $tags as $t => $v ) {

        // Обязательные элементы массива параметров
        if( empty( $v['open'] ) || empty( $v['close'] ) ) {
            return $result_false_pars;
        }

        // Попутно собираем термы в один регэксп
        $re[] = addcslashes($v['open'].'|'.$v['close'], '/');

        // Попутно формируем массив разбора -
        // ключ - открывающий тэг, значение - закрыващий
        if( !empty($search[$v['open']]) ) {

            // Не допускаются совпадения открывающих тэгов
            return $result_false_pars;

        }

        $search[$v['open']] = $v['close'];

    }
    $regexp .= join( '|', $re ).'/';

    //
    // Разбор входного текста
    //

    // Вырожденный случай - just for test
    if( strlen($txt) ==  0  ) {
        return $result_true;
    }

    // Формируем массив разбора
    preg_match_all( $regexp, $txt, $out );
    $out = $out[ 0 ];

    // Разбираем массив с помощью стека
    $stack = array();
    foreach( $out as $tag ) {

        $open = false;
        foreach( $tags as $k => $v ) {

            if( preg_match( "/".addcslashes($v['open'], '/')."/", $tag ) ) {
                // Открывающий тэг - пишем в стек
                // соответствующий закрывающий тэг
                $stack[] = $search[ $v['open'] ];
                $open = true;
                break;
            }

        }

        if( !$open ) {

            // Закрывающий тэг - извлекаем
            // и проверяем последний элемент стека
            if( array_pop( $stack ) != $tag ) {
                return $result_false_match;
            }

        }

    } // разбор результатов поиска тэгов

    // Если стек после разбора непуст -
    // налицо несоответствие тэгов
    if( count( $stack ) >  0  ) {
        return $result_false_match;
    }

    // Все условия выполнены, тэги соответствуют
    return $result_true;

} // function checkTags()

Это работает, но это некрасиво и лучше придумать что-то другое.


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33620862
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Че-то не работает все равно! =(
А может в открывающих тегах записывать только само "имя" тега, а уже внутри функции при сборке регекспа "одевать" его в треугольные скобки?
Попробовал поменять строчку:
Код: plaintext
$re[] = addcslashes('<'.$v['open'].'[^>]*>'.'|'.$v['close'], '/'); 
где $v['open'] - просто, скажем, "table". Все равно пишет несоответствие на простейших примерах (типа "<table><td colspan=2> fhkhjk</td></table>") ;-( Почему?
А изменится ли что-нибудь принципиально, если осуществлять два preg_match_all на открывающие и закрывающие теги а потом сравнить длины массивов с результатами? Причем, например, регексп для открывающих будет выглядить типа такого:

Код: plaintext
'#</*(table|tr|td|body)[^>]*>#i'
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33621048
I_Work
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внесу и свою лепту в эту тему, поскольку намечается что-то подобное в будущем (только все гораздо серьезнее).

1. Начну с того, что код "<i>превед <b>кросавчег</i></b>" не является вылидным с точки зрения HTML, несмотря на то, что некоторые броузеры и обрабатывают его так, как как большинству из нас кажется правильным! Не будем же мы уподобляться броузеру и идти против стандартов.

2. В любом случае придется использовать стек (может и не в любом, но по крайней мере наиболее удобно и эффективно). Однако здесь надо учесть некоторые особенности следования тегов. Так, например, теги <td></td> должны быть заключены в теги <tr></tr>, которые в свою очередь - в теги <table></table>.

3. Такие теги, как <b>, <i> и некоторые другие, в принципе, могут и не иметь закрывающих, в то время как теги типа <td>, <div>, <table> должны иметь соответствующий закрывающий.

Поэтому решение этой проблемы не является такой уж тривиальной задачей, как проверка на валидность расстановки скобок в выражении (типа "(({[{{{)}}){}{}}")
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33621092
I_Work
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову.

Вопрос стоял такой:
Код: plaintext
Скажите, а как проверить в хтмл коде, равняется ли число открывающих тегов числу закрывающих?

Ответ: посчитать количества открывающих и закрывающих тегов и сравнить результаты.

Пример: "<p><b></table></html>" - количества открывающих и закрывающих тегов одинаковы!

Давайте будем чуть более точными. Может я и придираюсь, но все же часто возникают споры людей (в данном конкретном случае все, конечно, поняли, что имел в виду автор) из-за того, что каждый видит некоторые вещи в своем собственном свете.

С уважением, Евгений.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33621936
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DipishЧе-то не работает все равно! =(
А может в открывающих тегах записывать только само "имя" тега, а уже внутри функции при сборке регекспа "одевать" его в треугольные скобки?
Попробовал поменять строчку:
Код: plaintext
$re[] = addcslashes('<'.$v['open'].'[^>]*>'.'|'.$v['close'], '/'); 
где $v['open'] - просто, скажем, "table". Все равно пишет несоответствие на простейших примерах (типа "<table><td colspan=2> fhkhjk</td></table>") ;-( Почему?


Потому что ты забыл правильно определить тэги.

Вот с таким параметром tags
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$tags = array(
    'table' => array(
        'open'  => '<table[^>]*>'
      , 'close' => '</table>'
    )
  , 'td'    => array(
        'open'  => '<td[^>]*>'
      , 'close' => '</td>'
    )
);
функция checkTags выдаст правильный ответ - "тэги соответствуют".


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #33621947
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I_Work1. Начну с того, что код "<i>превед <b>кросавчег</i></b>" не является вылидным с точки зрения HTML, несмотря на то, что некоторые броузеры и обрабатывают его так, как как большинству из нас кажется правильным! Не будем же мы уподобляться броузеру и идти против стандартов.


Возможно. Мне что-то такое помнилось про html то ли 3.0, то ли более ранний.

I_Work2. В любом случае придется использовать стек (может и не в любом, но по крайней мере наиболее удобно и эффективно). Однако здесь надо учесть некоторые особенности следования тегов. Так, например, теги <td></td> должны быть заключены в теги <tr></tr>, которые в свою очередь - в теги <table></table>.


На самом деле, тут придется использовать конечный автомат. Стек - просто удобная реализация простейшего автомата.

I_Work
3. Такие теги, как <b>, <i> и некоторые другие, в принципе, могут и не иметь закрывающих, в то время как теги типа <td>, <div>, <table> должны иметь соответствующий закрывающий.


Соответственно, граф переходов автомата должен это отражать - только и всего ;)


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
(PHP) Проверка открывающих и закрывающих тегов
    #37774544
kapa6a3er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос решается просто до безобразия
регекспом удаляет элементы не имеющие закрывашек
а затем проверяем по алгоритму что все теги имеют закрывашку

на перле удаляющий регехсп будет выглядеть так (удалит все конструкции типа <name параметры> <name параметры/> <name> <name/> </name> где name один из тегов img hr br meta и такдалее)
на PHP переводите сами :)

$html=~s/<\/?(img|hr|br|meta).*?\/?>//sg;
...
Рейтинг: 0 / 0
(PHP) Проверка открывающих и закрывающих тегов
    #37775980
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kapa6a3er,

ага
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Проверка открывающих и закрывающих тегов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]