Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Допустимые теги в строке

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
246978
Отправлено: 28 Ноября, 2013 - 21:19:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 273
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)

[+]


Скажите как, можно сделать такое, есть строка в ней допускаются только html теги <li>, <lu>, <a>? а если в строке найдены другие теги тогда вернуть false.
 
 Top
dXdYdZ
Отправлено: 28 Ноября, 2013 - 22:02:51
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




Не знаю, насколько это правильно, но навскидку, первое, что пришло в голову -
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function not_tags($str)
  4.     {
  5.     return strlen(strip_tags($str, '<li><ul><a>'))===strlen($str);
  6.     }
  7.  
  8. var_dump(not_tags('asdasd <ul id="1"><li>111</li></ul> '));
  9. //true
  10. var_dump(not_tags('<div id="2">111111</div> <ul>asd</ul>'));
  11. //false
  12. ?>
  13.  

По производительности, конечно, не оптимальный вариант, зато простой. Хотя, может есть какая-то специальная функция для этих целей?
 
 Top
armancho7777777 Супермодератор
Отправлено: 28 Ноября, 2013 - 22:40:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




PHP:
скопировать код в буфер обмена
  1. if(preg_match('/<(?!ul|li|a)(?P<tag>\w+)[^>]*?>/si', $text, $match)) {
  2.     echo 'Недопустимые теги: <b>' . $match['tag'] . '</b>';    
  3. }


Ещё вариант.
Вторым аргументом передаются имена допустимых тегов, перечисленных через запятую.
PHP:
скопировать код в буфер обмена
  1. function disallowedTagsExiststs($text, $allowedTags = 'ul,li,a')
  2. {
  3.     $allowedTags = preg_replace('/\s*,\s*/', '|', $allowedTags);
  4.     return !!preg_match('/<(?!' . $allowedTags . ')(?P<tag>\w+)[^>]*?>/si', $text);
  5. }
  6.  
  7. var_dump(disallowedTagsExiststs($text));

(Отредактировано автором: 28 Ноября, 2013 - 22:55:29)

 
 Top
Ch_chov
Отправлено: 29 Ноября, 2013 - 06:59:41
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




dXdYdZ, а зачем strlen ?

PHP:
скопировать код в буфер обмена
  1. return $text == strip_tags($text, '<li><a><ul>');
 
 Top
246978
Отправлено: 29 Ноября, 2013 - 08:29:09
Post Id



Посетитель


Покинул форум
Сообщений всего: 273
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)

[+]


Всем спасибо, все круто

(Отредактировано автором: 29 Ноября, 2013 - 08:29:31)

 
 Top
dXdYdZ
Отправлено: 29 Ноября, 2013 - 11:40:44
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




Ch_chov пишет:
dXdYdZ, а зачем strlen ?

Потому что проверить длину строки, наверное, быстрее, чем посимвольно сравнить 2 строки.
 
 Top
Ch_chov
Отправлено: 29 Ноября, 2013 - 12:59:52
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




dXdYdZ пишет:
Потому что проверить длину строки, наверное, быстрее, чем посимвольно сравнить 2 строки

Проверил. Абосолютно одинаково работает. Даже, на больших строках. А почему вы решили что PHP сравнивает строки посимвольно?
 
 Top
dXdYdZ
Отправлено: 29 Ноября, 2013 - 14:41:54
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




Ch_chov пишет:
Проверил. Абосолютно одинаково работает. Даже, на больших строках. А почему вы решили что PHP сравнивает строки посимвольно?

Ну, потому что, если бы я писал сравнение строк на asm или на C++, то я сравнивал бы их в цикле именно посимвольно. А как ещё можно сравнить 2 строки? Мне вот стало интересно, может можно ещё как-то?
Второй вопрос, что, если PHP использует внутри интерпретатора строки, оканчивающиеся на нулевой байт (как принято в C), то для определения их длины всё равно придётся пробежаться циклом по этим строкам в поисках этого самого нулевого байта. Разница, в общем, лишь в том, что во втором случае не надо будет выполнять cmp со значениями из второй строки, а только с нулевым байтом, может быть будет чуточку быстрее.
Тут ещё может быть, что на процессорах с соответствующей архитектурой (а сейчас таких большинство) строки сравниваются векторными командами (работающими сразу с массивом данных) (как они точно называются, уже и не помню, давно я asm интересовался), но всё равно сравнить с 0 по-моему чуть проще, чем сравнить со значением из 2-го массива. Хотя, может я и ошибаюсь. Это надо написать на asm и посчитать количество тактов, требующихся на одну итерацию цикла в обоих случаях, тогда понятно будет.
 
 Top
armancho7777777 Супермодератор
Отправлено: 29 Ноября, 2013 - 15:16:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




dXdYdZ пишет:
на C++, то я сравнивал бы их в цикле именно посимвольно

Почему не функцией strcmp ?
 
 Top
dXdYdZ
Отправлено: 29 Ноября, 2013 - 15:23:18
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




armancho7777777 пишет:
Почему не функцией strcmp ?

А функция strcmp их в конечном итоге (откомпилированная в машинном коде) сравнивает не посимвольно разве?
(Добавление)
По-моему процессор сравнивает строки посимвольно, как ни крути.
(Добавление)
Или по 4 (32 разрядные) - 8(64) байт.
 
 Top
armancho7777777 Супермодератор
Отправлено: 29 Ноября, 2013 - 15:35:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




dXdYdZ пишет:
сравнивает не посимвольно разве?

Я спрашиваю у Вас, а Вы у меня ?)
(Добавление)
Ну а вообще да, логично.
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Ноября, 2013 - 19:27:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




dXdYdZ пишет:
посимвольно
Помоему для начала следует измерить длины строк, и если они не равны, значит и строки не равны. Тогда бежать посимвольно уже не нужно будет. Но это на сях. На пхп же лучше сразу сравнить и все.
 
 Top
q21
Отправлено: 09 Мая, 2014 - 03:00:31
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




dXdYdZ пишет:
Ну, потому что, если бы я писал сравнение строк на asm или на C++, то я сравнивал бы их в цикле именно посимвольно. А как ещё можно сравнить 2 строки?
...
А функция strcmp их в конечном итоге (откомпилированная в машинном коде) сравнивает не посимвольно разве?
Или по 4 (32 разрядные) - 8(64) байт.

Ещё во времена MS DOS были команды CMPS и SCAS для сравнения и поиска строк - это намного быстрее, чем писать цикл. А сейчас есть, напр., http://ru[dot]wikipedia[dot]org/wiki/SSE4 .

Более того, процессоры до того дошли, что умеют определять, нужны ли ассемблерной команде результаты предыдущей. И выполняют несколько последовательных команд одновременно, если они не зависят от результатов друг друга. Вот тут товарищ интересно и доступно про оптимизацию пишет
http://www[dot]agner[dot]org/optimize/
И особо оптимизированные библиотечки там есть.
(А, теоретически, все современные компиляторы, интерпретаторы и стандартные библиотечки должны всем этим пользоваться...)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB