├── .gitattributes ├── .travis.yml ├── .gitignore ├── composer.json ├── LICENSE ├── symbolclass.php ├── CHANGELOG.md ├── README.md ├── DOCUMENTATION.md ├── test.php └── qevix.php /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | # list any PHP version you want to test against 4 | php: 5 | - 5.4 6 | - 5.5 7 | - 5.6 8 | - 7.0 9 | - hhvm 10 | 11 | script: phpunit test 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build results 2 | bin/ 3 | pkg/ 4 | 5 | #Bat 6 | *.bat 7 | 8 | # Log 9 | *.log 10 | 11 | # Windows image file caches 12 | Thumbs.db 13 | 14 | # Folder config file 15 | Desktop.ini 16 | 17 | # Mac crap 18 | .DS_Store 19 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "qevix/qevix", 3 | "description": "Automatic filter HTML/XHTML", 4 | "keywords": ["qevix", "html", "xhtml"], 5 | "homepage": "https://github.com/AlexanderGrom/php-qevix", 6 | "type": "library", 7 | "license": "MIT", 8 | "require": { 9 | "php": ">=5.0.0", 10 | "ext-mbstring": "*" 11 | }, 12 | "autoload": { 13 | "classmap": ["qevix.php"] 14 | } 15 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2014 Alexander Gromov 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /symbolclass.php: -------------------------------------------------------------------------------- 1 | ', '[', ']', '{', '}', '(', ')'), Qevix::TEXT_BRACKET | Qevix::PRINATABLE); 37 | 38 | addChClass($table, array('@', '#', '$'), Qevix::SPECIAL_CHAR | Qevix::PRINATABLE); 39 | 40 | ob_start(); 41 | var_export($table); 42 | $res = ob_get_clean(); 43 | echo str_replace(array("\n", ' '), '', $res).';'; 44 | ?> 45 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### v0.4.3 — [19.11.2016] 2 | * Исправлена ошибка с указанием атрибутов без значения. 3 | * Добавлен шаблон #bool, для валидного отображения атрибутов без значения. 4 | 5 | ### v0.4 — [15.01.2016] 6 | * Добавлено новое правило задания шаблона #link. Шаблон может быть указана ввиде строки или ввиде массива с указанием разрешенных доменов. Например, `'src' => array('#link' => ['youtube.com', 'vimeo.com'])` 7 | 8 | ### v0.3.1 — [15.09.2015] 9 | * В классы символов добавлен символ дефиса для имен атрибутов тега. Другими словами имена атрибутов теперь могут быть с дефисом. 10 | * Добавлен механизм чистки пробельных символов и символов перевода строки после удаленных парсером тегов 11 | 12 | ### v0.3 — [07.09.2015] 13 | * New 14 | * Новый конфиг cfgSetEOL($nl), позволяет задать символ/символы перевода строки для текста на выходе. По умолчанию в Qevix используется только символ перевода строки (LF) "\n", теперь можно задать (CR+LF) "\r\n". 15 | * Новый шаблон #regexp(...) для значений параметров тега. Позволяет сверять значение параметра с регулярным выражением. Например, "#regexp(\d+(%|px))". 16 | * Bug Fixes 17 | * Исправлена ошибка в определение чисел шаблона #int 18 | * Other 19 | * Чистка и мелкие исправления 20 | 21 | ### v0.2.3 — [01.07.2015] 22 | * XHTML ShortTag Fix 23 | * Поправлено распознавание коротких тегов в стиле XHTML 24 | * AutoLink Fix 25 | * Поправлено распознавание текстовой ссылки обернутой тегом 26 | * Other BugFixes 27 | * Поправлена печать "бесхозной" открывающей угловой скобки "<" 28 | 29 | ### v0.2.2 — [23.03.2015] 30 | * Добавлен Composer 31 | 32 | ### v0.2.1 — [22.01.2015] 33 | * Улучшена производительность 34 | * Замена методов ord и chr основанных на mb_* функциях на их более быстрые эквиваленты 35 | 36 | ### v0.2 — [20.01.2015] 37 | * AutoLink Fix 38 | * Теперь распознаются ссылки заключенные в двойные кавычки 39 | * Старается полностью распазнать ссылки с параметрами оформленными в виде массива (?param[0]=nil¶m[1]=one) 40 | 41 | ### v0.1 — [02.12.2014] 42 | * Первый публичный выпуск 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## Qevix [![Build Status](https://travis-ci.org/AlexanderGrom/php-qevix.svg?branch=master)](https://travis-ci.org/AlexanderGrom/php-qevix) 3 | 4 | **Qevix** — Jevix-подобный автоматический фильтр HTML/XHTML разметки в текстах. 5 | Применяя наборы правил, контролирует перечень допустимых тегов и атрибутов, предотвращает возможные XSS-атаки. 6 | 7 | Qevix основывается на идеях и исходном коде [PHP версии Jevix](https://github.com/ur001/Jevix/). 8 | Фильтр полностью переписан, устраняет ряд ошибок и недоработок, а также вводит новые возможности в правила фильтрации. 9 | 10 | ### Возможности 11 | 12 | * Фильтрация текста с HTML/XHTML разметкой на основе заданных правил о разрешённых тегах и атрибутах; 13 | * Исправление ошибок HTML/XHTML; 14 | * Обработка строк предваренных специальными символами (#tagname, @username, $keyword); 15 | * Установка на теги callback-функций для изменения или сбора информации; 16 | * Предотвращение XSS-атак; 17 | 18 | ### Требования 19 | 20 | * PHP >= 5.0 21 | * php-mbstring 22 | * UTF-8 23 | 24 | ### Пример использования 25 | 26 | ```php 27 | require('qevix.php'); 28 | 29 | $qevix = new Qevix(); 30 | 31 | // Конфигурация 32 | 33 | // 1. Задает список разрешенных тегов 34 | $qevix->cfgAllowTags(array('b', 'i', 'u', 'a', 'img', 'ul', 'li', 'ol', 'br', 'code', 'pre', 'div', 'cut')); 35 | 36 | // 2. Указывает, какие теги считать короткими (
, ) 37 | $qevix->cfgSetTagShort(array('br','img','cut')); 38 | 39 | // 3. Указывает преформатированные теги, в которых нужно всё заменять на HTML сущности 40 | $qevix->cfgSetTagPreformatted(array('code')); 41 | 42 | // 4. Указывает не короткие теги, которые могут быть пустыми и их не нужно из-за этого удалять 43 | $qevix->cfgSetTagIsEmpty(array('div')); 44 | 45 | // 5. Указывает теги, внутри которых не нужна авто-расстановка тегов перевода на новую строку 46 | $qevix->cfgSetTagNoAutoBr(array('ul', 'ol')); 47 | 48 | // 6. Указывает теги, которые необходимо вырезать вместе с содержимым 49 | $qevix->cfgSetTagCutWithContent(array('script', 'object', 'iframe', 'style')); 50 | 51 | // 7. Указывает теги, после которых не нужно добавлять дополнительный перевод строки. Например, блочные теги 52 | $qevix->cfgSetTagBlockType(array('ol','ul','code')); 53 | 54 | // 8. Добавляет разрешенные параметры для тегов. Значение по умолчанию - шаблон #text. Разрешенные шаблоны #text, #int, #link, #regexp(...) (Например: "#regexp(\d+(%|px))") 55 | $qevix->cfgAllowTagParams('a', array('title', 'href' => '#link', 'rel' => '#text', 'target' => array('_blank'), 'download' => '#bool')); 56 | $qevix->cfgAllowTagParams('img', array('src' => '#text', 'alt' => '#text', 'title', 'align' => array('right', 'left', 'center'), 'width' => '#int', 'height' => '#int')); 57 | 58 | // 9. Добавляет обязательные параметры для тега 59 | $qevix->cfgSetTagParamsRequired('img', 'src'); 60 | $qevix->cfgSetTagParamsRequired('a', 'href'); 61 | 62 | // 10. Указывает, какие теги являются контейнерами для других тегов 63 | $qevix->cfgSetTagChilds('ul', 'li', true, true); 64 | $qevix->cfgSetTagChilds('ol', 'li', true, true); 65 | 66 | // 11. Указывает, какие теги не должны быть дочерними к другим тегам 67 | $qevix->cfgSetTagGlobal('cut'); 68 | 69 | // 12. Устанавливаем атрибуты тегов, которые будут добавляться автоматически 70 | $qevix->cfgSetTagParamDefault('a', 'rel', 'nofollow', true); 71 | $qevix->cfgSetTagParamDefault('img', 'alt', ''); 72 | 73 | // 13. Указывает теги, в которых нужно отключить типографирование текста 74 | $qevix->cfgSetTagNoTypography(array('code', 'pre')); 75 | 76 | // 14. Устанавливает список разрешенных протоколов для ссылок (https, http, ftp) 77 | $qevix->cfgSetLinkProtocolAllow(array('http','https')); 78 | 79 | // 15. Включает или выключает режим XHTML 80 | $qevix->cfgSetXHTMLMode(false); 81 | 82 | // 16. Включает или выключает режим автозамены символов переводов строк на тег br 83 | $qevix->cfgSetAutoBrMode(true); 84 | 85 | // 17. Включает или выключает режим автоматического определения ссылок 86 | $qevix->cfgSetAutoLinkMode(true); 87 | 88 | // 18. Задает символ/символы перевода строки. По умполчанию "\n". Разрешено "\n" или "\r\n" 89 | $qevix->cfgSetEOL("\n"); 90 | 91 | // 19. Устанавливает на тег callback-функцию 92 | $qevix->cfgSetTagBuildCallback('code', 'tag_code_build'); 93 | 94 | // 20. Устанавливает на строку предворенную спецсимволом (@|#|$) callback-функцию 95 | $qevix->cfgSetSpecialCharCallback('#', 'tag_sharp_build'); 96 | $qevix->cfgSetSpecialCharCallback('@', 'tag_at_build'); 97 | 98 | // 21. Устанавливает на тег callback-функцию, которая сохраняет URL изображений для meta-описания 99 | $qevix->cfgSetTagEventCallback('img', 'tag_img_event'); 100 | 101 | //----- 102 | 103 | function tag_code_build($tag, $params, $content) 104 | { 105 | return '
'.$content.'
'."\n";
106 | }
107 | 
108 | //-----
109 | 
110 | $meta_img_src = array();
111 | 
112 | function tag_img_event($tag, $params, $content)
113 | {
114 | 	global $meta_img_src;
115 | 
116 | 	$meta_img_src[] = $params['src'];
117 | }
118 | 
119 | //-----
120 | 
121 | function tag_sharp_build($string)
122 | {
123 | 	if(!preg_match('#^[\w\_\-\ ]{1,32}$#isu', $string)) {
124 | 		return false;
125 | 	}
126 | 
127 | 	return '#'.$string.'';
128 | }
129 | 
130 | //-----
131 | 
132 | function tag_at_build($string)
133 | {
134 | 	if(!preg_match('#^[\w\_\-\ ]{1,32}$#isu', $string)) {
135 | 		return false;
136 | 	}
137 | 
138 | 	return '@'.$string.'';
139 | }
140 | 
141 | //-----
142 | 
143 | //Фильтр
144 | 
145 | $text = <<Qevix и я много чего могу...
147 | 
148 | 

Этого тега нет в разрешенных

149 | 150 | 151 |

152 |
153 | 154 | Отмечать метки #qevix, #php, #[mysql], #{mariaDB}, #[два слова]. 155 | Людей @Alexander @Андрей @[Илья Андреевич Ростов] 156 | 157 | (Вы можете запретить определение меток из нескольких слов, просто проверяя это в callback функции) 158 | 159 | Работать с разными тегами Но не с этим ... зачеркивать нельзя, 160 | 161 | Так же я запрещаю iframe, style и object... но это согласно текущим правилам. 162 | 163 | А такие теги сейчас разрешены: Куда же без выделения жирным или курсива... 164 | И вложенность не помеха 165 | 166 | Могу выделить код используя callback функцию: 167 | 168 | 169 | 170 | JavaScript: 171 | 172 | 173 | 174 | 175 | Могу подсвечивать ссылки так https://github.com или так www.yandex.ru или в скобках (http://webonrails.ru)! 176 | Могу найти ссылку в теге http://webonrails.ru. 177 | Или ссылка может быть более сложной http://yandex.ru/yandsearch?lr=2&text=qevix!.. 178 | А также традиционная Википедия 179 | Но только не опасная Hello World! 180 | И без ненужных атрибутов GitHub 181 | Или вот такая Я могу определить атрибуты без кавычек! 182 | 183 | Использовать изображения Image 184 | 185 | Могу менять "кавычки" на елочки и "соблюдать "вложенность" кавычек"... 186 | 187 | Использовать преформатирование
Могу менять "кавычки" на елочки и "соблюдать "вложенность" кавычек"
188 | 189 | Убирать такой код: 190 |
  • Пункт 1
  • 191 |
  • Пункт 2
  • 192 | 193 | И оставлять такой: 194 | 195 |
      196 |
    • Пункт 1
    • 197 |
    • Пункт 2
    • 198 |
    199 | 200 | Могу удалить это верхний перевод строки, что бы текст под блочными элементами нормально отображался. 201 | 202 | Преобразовывать коды символов ( ) * + , обратно в символы. 203 | 204 | Преобразовывать в тексте короткое тире - в длинное, но не в таком (2-2=0) и не в таком (веб-программирование) 205 | Зато могу работать с пунктами (диалогами): 206 | - Пункт 1 207 | - Пункт 2 208 | - Пункт 3 209 | 210 | Могу делать правильный CUT: Краткая часть Тег не может быть вложенным 211 | 212 | Могу убирать лишние пробелы и сам закрывать теги 213 | EOD; 214 | 215 | $result = $qevix->parse($text, $errors); 216 | 217 | echo $result; 218 | ``` 219 | 220 | ### Документация по конфигурации 221 | 222 | * [DOCUMENTATION](DOCUMENTATION.md) 223 | 224 | ### Поддержка 225 | 226 | * **Александр Громов** - пишите в [Issues](https://github.com/AlexanderGrom/php-qevix/issues) 227 | 228 | ------ 229 | 230 | Дайте мне знать, если вы нашли проблему в **Qevix** или вас не устраивает его работа. 231 | Спасибо! 232 | -------------------------------------------------------------------------------- /DOCUMENTATION.md: -------------------------------------------------------------------------------- 1 | 2 | ## Документации по конфигурации 3 | 4 | ### cfgAllowTags 5 | 6 | cfgAllowTags — Задает список разрешенных тегов 7 | 8 | `cfgAllowTags($tags);` 9 | 10 | **Параметры** 11 | * $tags — (array|string) список разрешенных тегов 12 | 13 | **Пример использования** 14 | ```php 15 | $qevix->cfgAllowTags(array('b', 'i', 'u', 'a', 'img', 'ul', 'li', 'ol', 'br', 'code')); 16 | ``` 17 | 18 | ### cfgSetTagShort 19 | 20 | cfgSetTagShort — Указывает какие теги считать короткими 21 | 22 | `$qevix->cfgSetTagShort($tags)` 23 | 24 | **Параметры** 25 | * $tags — (array|string) тег(и) 26 | 27 | **Пример использования** 28 | ```php 29 | $qevix->cfgSetTagShort(array('br','img')); 30 | ``` 31 | 32 | ### cfgSetTagPreformatted 33 | 34 | cfgSetTagPreformatted — Указывает преформатированные теги, в которых нужно всё заменять на HTML сущности 35 | 36 | `$qevix->cfgSetTagPreformatted($tags)` 37 | 38 | **Параметры** 39 | * $tags — (array|string) тег(и) 40 | 41 | **Пример использования** 42 | ```php 43 | $qevix->cfgSetTagPreformatted(array('code')); 44 | ``` 45 | 46 | ### cfgSetTagNoTypography 47 | 48 | cfgSetTagNoTypography — Указывает теги в которых нужно отключить типографирование текста 49 | 50 | `$qevix->cfgSetTagNoTypography($tags)` 51 | 52 | **Параметры** 53 | * $tags — (array|string) тег(и) 54 | 55 | **Пример использования** 56 | ```php 57 | $qevix->cfgSetTagNoTypography(array('code')); 58 | ``` 59 | 60 | ### cfgSetTagIsEmpty 61 | 62 | cfgSetTagIsEmpty — Указывает не короткие теги, которые могут быть пустыми и их не нужно из-за этого удалять 63 | 64 | `$qevix->cfgSetTagIsEmpty($tags)` 65 | 66 | **Параметры** 67 | * $tags — (array|string) тег(и) 68 | 69 | **Пример использования** 70 | ```php 71 | $qevix->cfgSetTagIsEmpty(array('div')); 72 | ``` 73 | 74 | ### cfgSetTagNoAutoBr 75 | 76 | cfgSetTagNoAutoBr — Указывает теги внутри, которых не нужна авто-расстановка тегов перевода на новую строку 77 | 78 | `$qevix->cfgSetTagNoAutoBr($tags)` 79 | 80 | **Параметры** 81 | * $tags — (array|string) тег(и) 82 | 83 | **Пример использования** 84 | ```php 85 | $qevix->cfgSetTagNoAutoBr(array('ul', 'ol')); 86 | ``` 87 | 88 | ### cfgSetTagCutWithContent 89 | 90 | cfgSetTagCutWithContent — Указывает теги, которые необходимо вырезать вместе с содержимым 91 | 92 | `$qevix->cfgSetTagCutWithContent($tags)` 93 | 94 | **Параметры** 95 | * $tags — (array|string) тег(и) 96 | 97 | **Пример использования** 98 | ```php 99 | $qevix->cfgSetTagCutWithContent(array('script', 'object', 'iframe', 'style')); 100 | ``` 101 | 102 | ### cfgSetTagBlockType 103 | 104 | cfgSetTagBlockType — Указывает теги после, которых не нужно добавлять дополнительный перевод строки, например, блочные теги 105 | 106 | `$qevix->cfgSetTagBlockType($tags)` 107 | 108 | **Параметры** 109 | * $tags — (array|string) тег(и) 110 | 111 | **Пример использования** 112 | ```php 113 | $qevix->cfgSetTagBlockType(array('ol','ul','code')); 114 | ``` 115 | 116 | ### cfgAllowTagParams 117 | 118 | cfgAllowTagParams — Добавляет разрешенные параметры для тегов. Значение по умолчанию - шаблон #text. Разрешенные шаблоны #text, #bool, #int, #link, #regexp(...). 119 | Шаблон с регулярным выражением может выглядеть так: "#regexp(\d+(%|px))" 120 | Шаблон #link может быть задан строкой или описан массивом с указанием разрешенных доменов: "array('#link' => ['youtube.com', 'video.com'])" 121 | 122 | `$qevix->cfgAllowTagParams($tag, $params)` 123 | 124 | **Параметры** 125 | * $tag — (string) тег 126 | * $params — (string|array) разрешённые параметры 127 | 128 | **Пример использования** 129 | ```php 130 | $qevix->cfgAllowTagParams('a', array('title', 'href' => '#link', 'rel' => '#text', 'target' => array('_blank'), 'download' => '#bool')); 131 | $qevix->cfgAllowTagParams('img', array('src' => '#text', 'alt' => '#text', 'title', 'align' => array('right', 'left', 'center'), 'width' => '#int', 'height' => '#int')); 132 | $qevix->cfgAllowTagParams('video', array('src' => array('#link' => ['youtube.com', 'video.com'])); 133 | ``` 134 | 135 | ### cfgSetTagParamsRequired 136 | 137 | cfgSetTagParamsRequired — Добавляет обязательные параметры для тега 138 | 139 | `$qevix->cfgSetTagParamsRequired($tag, $params)` 140 | 141 | **Параметры** 142 | * $tag — (string) тег 143 | * $params — (string|array) разрешённые параметры 144 | 145 | **Пример использования** 146 | ```php 147 | $qevix->cfgSetTagParamsRequired('img', 'src'); 148 | $qevix->cfgSetTagParamsRequired('a', 'href'); 149 | ``` 150 | 151 | ### cfgSetTagChilds 152 | 153 | cfgSetTagChilds — Указывает какие теги являются контейнерами для других тегов 154 | 155 | `$qevix->cfgSetTagChilds($tag, $childs, $isParentOnly = false, $isChildOnly = false)` 156 | 157 | **Параметры** 158 | * $tag — (string) тег 159 | * $childs — (string|array) разрешённые дочерние теги 160 | * $isParentOnly — (boolean) тег является только контейнером других тегов и не может содержать текст 161 | * $isChildOnly — (boolean) дочерние теги не могут присутствовать нигде кроме указанного тега 162 | 163 | **Пример использования** 164 | ```php 165 | $qevix->cfgSetTagChilds('ul', 'li', true, true); 166 | $qevix->cfgSetTagChilds('ol', 'li', true, true); 167 | ``` 168 | 169 | ### cfgSetTagGlobal 170 | 171 | cfgSetTagGlobal — Указывает какие теги не должны быть дочерними к другим тегам 172 | 173 | `$qevix->cfgSetTagGlobal($tags)` 174 | 175 | **Параметры** 176 | * $tags — (string|array) тег(и) 177 | 178 | **Пример использования** 179 | ```php 180 | $qevix->cfgSetTagGlobal('cut'); 181 | ``` 182 | 183 | ### cfgSetTagParamDefault 184 | 185 | cfgSetTagParamDefault — Указывает значения по умолчанию для параметров тега 186 | 187 | `$qevix->cfgSetTagParamDefault($tag, $param, $value, $isRewrite = false)` 188 | 189 | **Параметры** 190 | * $tag — (string) тег 191 | * $param — (string) атрибут тега 192 | * $value — (string) значение арибута 193 | * $isRewrite — (boolean) перезаписывать значение значением по умолчанию 194 | 195 | **Пример использования** 196 | ```php 197 | $qevix->cfgSetTagParamDefault('a', 'rel', 'nofollow', true); 198 | $qevix->cfgSetTagParamDefault('a', 'download', null); 199 | $qevix->cfgSetTagParamDefault('img', 'alt', ''); 200 | ``` 201 | 202 | ### cfgSetTagBuildCallback 203 | 204 | cfgSetTagBuildCallback — Устанавливает на тег callback-функцию для ручной сборки тега 205 | 206 | `$qevix->cfgSetTagBuildCallback($tag, $callback)` 207 | 208 | **Параметры** 209 | * $tag — (string) тег 210 | * $callback — (mixed) функция 211 | 212 | **Пример использования** 213 | ```php 214 | $qevix->cfgSetTagBuildCallback('code', 'tag_code_build'); 215 | 216 | function tag_code_build($tag, $params, $content) 217 | { 218 | return '
    '.$content.'
    '."\n";
    219 | }
    220 | ```
    221 | 
    222 | ### cfgSetTagEventCallback
    223 | 
    224 | cfgSetTagEventCallback — Устанавливает на тег callback-функцию для сбора информации. В отличие от callback-функций установленных с помощью cfgSetTagBuildCallback, этот обработчик не вносит изменения в текст, а может быть использован для сбора какой-либо информации об используемых тегах.
    225 | Например, можно посчитать, какое количество изображений в тексте и сформировать массив из их URL для последующего использования в meta-описании станицы.
    226 | Для сбора информации, теги должны быть разрешены в cfgAllowTags.
    227 | 
    228 | `$qevix->cfgSetTagEventCallback($tag, $callback)`
    229 | 
    230 | **Параметры**
    231 | * $tag — (string) тег
    232 | * $callback — (mixed) функция
    233 | 
    234 | **Пример использования**
    235 | ```php
    236 | $qevix->cfgSetTagEventCallback('img', 'tag_img_event');
    237 | 
    238 | $meta_img_src = array();
    239 | 
    240 | function tag_img_event($tag, $params, $content)
    241 | {
    242 | 	global $meta_img_src;
    243 | 
    244 | 	$meta_img_src[] = $params['src'];
    245 | }
    246 | ```
    247 | 
    248 | ### cfgSetSpecialCharCallback
    249 | 
    250 | cfgSetSpecialCharCallback — Устанавливает на строку предваренную спецсимволом callback-функцию. По умолчанию Qevix работает с тремя спец. символами #, @, $. Но вы можете сгенерировать свой набор, воспользовавшись генератором классов символов symbolclass.php.
    251 |  Как можно догадаться, эта настройка позволяет получить хештег (#tagname) или имя пользователя (@username), или ключевое слово ($keyword) и оформить его в виде ссылки или того, что вам нужно.
    252 | 
    253 | `cfgSetSpecialCharCallback($char, $callback)`
    254 | 
    255 | **Параметры**
    256 | * $char — (string) спецсимвол #, @ или $
    257 | * $callback — (mixed) функция
    258 | 
    259 | **Пример использования**
    260 | ```php
    261 | $qevix->cfgSetSpecialCharCallback('#', 'tag_sharp_build');
    262 | $qevix->cfgSetSpecialCharCallback('@', 'tag_at_build');
    263 | 
    264 | function tag_sharp_build($string)
    265 | {
    266 | 	if(!preg_match('#^[\w\_\-\ ]{1,32}$#isu', $string)) {
    267 | 		return false;
    268 | 	}
    269 | 
    270 | 	return '#'.$string.'';
    271 | }
    272 | 
    273 | function tag_at_build($string)
    274 | {
    275 | 	if(!preg_match('#^[\w\_\-\ ]{1,32}$#isu', $string)) {
    276 | 		return false;
    277 | 	}
    278 | 
    279 | 	return '@'.$string.'';
    280 | }
    281 | ```
    282 | 
    283 | Вы можете сами отслеживать, какие символы могут входить в строку.
    284 | Qevix поддерживает два варианта обработки специальных строк #tag, #[tag] или #{tag string}.
    285 | Вариант со скобками может содержать пробелы, но вы можете их запретить в своей callback-функции и такие строки обрабатываться не будут.
    286 | 
    287 | ### cfgSetLinkProtocolAllow
    288 | 
    289 | cfgSetLinkProtocolAllow — Устанавливает список разрешенных протоколов для ссылок. По умолчанию разрешены http, https, ftp
    290 | 
    291 | `cfgSetLinkProtocolAllow($protocols)`
    292 | 
    293 | **Параметры**
    294 | * $protocols — (array) список протоколов
    295 | 
    296 | **Пример использования**
    297 | ```php
    298 | $qevix->cfgSetLinkProtocolAllow(array('http','https'));
    299 | ```
    300 | 
    301 | ### cfgSetXHTMLMode
    302 | 
    303 | cfgSetXHTMLMode — Включает или выключает режим XHTML. По умолчанию выключен.
    304 | 
    305 | `cfgSetXHTMLMode($isXHTMLMode)`
    306 | 
    307 | **Параметры**
    308 | * $isXHTMLMode — (boolean) Включить XHTML формат тегов установив в True;
    309 | 
    310 | **Пример использования**
    311 | ```php
    312 | $qevix->cfgSetXHTMLMode(true);
    313 | ```
    314 | 
    315 | ### cfgSetAutoBrMode
    316 | 
    317 | cfgSetAutoBrMode — Включает или выключает режим автозамены символов перевода строки на тег br. По умолчанию включен.
    318 | 
    319 | `cfgSetAutoBrMode($isAutoBrMode)`
    320 | 
    321 | **Параметры**
    322 | * $isAutoBrMode — (boolean) Включить авторасстановку тегов переда строки установив в True;
    323 | 
    324 | **Пример использования**
    325 | ```php
    326 | $qevix->cfgSetAutoBrMode(true);
    327 | ```
    328 | 
    329 | ### cfgSetAutoLinkMode
    330 | 
    331 | cfgSetAutoLinkMode — Включает или выключает режим автоматического определения ссылок. По умолчанию режим включен.
    332 | 
    333 | `cfgSetAutoLinkMode($isAutoLinkMode)`
    334 | 
    335 | **Параметры**
    336 | * $isAutoLinkMode — (boolean) Включить автоопределение ссылок установив в True;
    337 | 
    338 | **Пример использования**
    339 | ```php
    340 | $qevix->cfgSetAutoLinkMode(true);
    341 | ```
    342 | 
    343 | ### cfgSetEOL
    344 | 
    345 | cfgSetEOL — Задает символ/символы перевода строки для текста на выходе. По умолчанию используется только символ перевода строки (LF) "\n", можно задать (CR+LF) "\r\n".
    346 | 
    347 | `cfgSetEOL($nl)`
    348 | 
    349 | **Параметры**
    350 | * $nl — "\n" или "\r\n";
    351 | 
    352 | **Пример использования**
    353 | ```php
    354 | $qevix->cfgSetEOL("\r\n");
    355 | ```
    356 | 
    
    
    --------------------------------------------------------------------------------
    /test.php:
    --------------------------------------------------------------------------------
      1 | cfgAllowTags(array('b', 'i', 'u', 'a', 'img', 'ul', 'li', 'ol', 'br', 'code', 'pre', 'div', 'cut', 'video'));
     15 | 
     16 |         // 2. Указавает, какие теги считать короткими (
    , ) 17 | $qevix->cfgSetTagShort(array('br','img','cut', 'video')); 18 | 19 | // 3. Указывает преформатированные теги, в которых нужно всё заменять на HTML сущности 20 | $qevix->cfgSetTagPreformatted(array('code')); 21 | 22 | // 4. Указывает не короткие теги, которые могут быть пустыми и их не нужно из-за этого удалять 23 | $qevix->cfgSetTagIsEmpty(array('div')); 24 | 25 | // 5. Указывает теги внутри которых не нужна авто расстановка тегов перевода на новую строку 26 | $qevix->cfgSetTagNoAutoBr(array('ul', 'ol')); 27 | 28 | // 6. Указывает теги, которые необходимо вырезать вместе с содержимым 29 | $qevix->cfgSetTagCutWithContent(array('script', 'object', 'iframe', 'style')); 30 | 31 | // 7. Указывает теги, после которых не нужно добавлять дополнительный перевод строки, например, блочные теги 32 | $qevix->cfgSetTagBlockType(array('ol','ul','code','video','div')); 33 | 34 | // 8. Добавляет разрешенные параметры для тегов, значение по умолчанию шаблон #text. Разрешенные шаблоны #text, #int, #link, #regexp(...) (Например: "#regexp(\d+(%|px))") 35 | $qevix->cfgAllowTagParams('a', array('title', 'href' => '#link', 'rel' => '#text', 'target' => array('_blank'))); 36 | $qevix->cfgAllowTagParams('img', array('src' => '#text', 'alt' => '#text', 'title', 'align' => array('right', 'left', 'center'), 'width' => '#int', 'height' => '#int')); 37 | $qevix->cfgAllowTagParams('video', array('src' => ['#link' => ['youtube.com','vimeo.com']])); 38 | $qevix->cfgAllowTagParams('div', array('itemscope' => '#bool', 'itemtype' => '#link', 'class' => '#text')); 39 | 40 | // 9. Добавляет обязательные параметры для тега 41 | $qevix->cfgSetTagParamsRequired('a', 'href'); 42 | $qevix->cfgSetTagParamsRequired('img', 'src'); 43 | $qevix->cfgSetTagParamsRequired('video', 'src'); 44 | 45 | // 10. Указывает, какие теги являются контейнерами для других тегов 46 | $qevix->cfgSetTagChilds('ul', 'li', true, true); 47 | $qevix->cfgSetTagChilds('ol', 'li', true, true); 48 | 49 | // 11. Указывает, какие теги не должны быть дочерними к другим тегам 50 | $qevix->cfgSetTagGlobal('cut'); 51 | 52 | // 12. Устанавливаем атрибуты тегов, которые будут добавлятся автоматически 53 | $qevix->cfgSetTagParamDefault('a', 'rel', 'nofollow', true); 54 | $qevix->cfgSetTagParamDefault('img', 'alt', ''); 55 | 56 | // 13. Указывает теги, в которых нужно отключить типографирование текста 57 | $qevix->cfgSetTagNoTypography(array('code', 'pre')); 58 | 59 | // 14. Устанавливает список разрешенных протоколов для ссылок (https, http, ftp) 60 | $qevix->cfgSetLinkProtocolAllow(array('http','https')); 61 | 62 | // 15. Включает или выключает режим XHTML 63 | $qevix->cfgSetXHTMLMode(false); 64 | 65 | // 16. Включает или выключает режим автозамены символов переводов строк на тег
    66 | $qevix->cfgSetAutoBrMode(true); 67 | 68 | // 17. Включает или выключает режим автоматического определения ссылок 69 | $qevix->cfgSetAutoLinkMode(true); 70 | 71 | // 18. Задает символ/символы перевода строки. По умполчанию "\n". Разрешено "\n" или "\r\n" 72 | $qevix->cfgSetEOL("\n"); 73 | 74 | // 19. Устанавливает на тег callback-функцию 75 | $qevix->cfgSetTagBuildCallback('code', [__CLASS__, 'tagCodeBuild']); 76 | 77 | // 20. Устанавливает на строку предварённую спецсимволом (@|#|$) callback-функцию 78 | $qevix->cfgSetSpecialCharCallback('#', [__CLASS__, 'tagSharpBuild']); 79 | $qevix->cfgSetSpecialCharCallback('@', [__CLASS__, 'tagAtBuild']); 80 | 81 | static::$qevix = $qevix; 82 | } 83 | 84 | public static function tearDownAfterClass() 85 | { 86 | static::$qevix = null; 87 | } 88 | 89 | public static function tagCodeBuild($tag, $params, $content) 90 | { 91 | return '
    '.$content.'
    '."\n";
     92 |     }
     93 | 
     94 |     public static function tagSharpBuild($string)
     95 |     {
     96 |         if (!preg_match('#^[\w\_\-\ ]{1,32}$#isu', $string)) {
     97 |             return false;
     98 |         }
     99 | 
    100 |         return '#'.$string.'';
    101 |     }
    102 | 
    103 |     public static function tagAtBuild($string)
    104 |     {
    105 |         if (!preg_match('#^[\w\_\-]{1,32}$#isu', $string)) {
    106 |             return false;
    107 |         }
    108 | 
    109 |         return '@'.$string.'';
    110 |     }
    111 | 
    112 |     public function textsDataProvider()
    113 |     {
    114 |         return array(
    115 |             [
    116 |                  'текст текст текст',
    117 |                  'текст текст текст'
    118 |             ], [
    119 |                 'текст текст текст',
    120 |                 'текст текст текст'
    121 |             ], [
    122 |                 'текст текст текст',
    123 |                 'текст текст текст'
    124 |             ], [
    125 |                 'текст текст текст',
    126 |                 'текст текст текст'
    127 |             ], [
    128 |                 'текст текст текст',
    129 |                 'текст текст текст'
    130 |             ], [
    131 |                 'текст  текст',
    132 |                 'текст текст'
    133 |             ], [
    134 |                 'текст  текст',
    135 |                 '
    текст <script>текст</script> текст
    '
    136 |             ], [
    137 |                 'текст 
    текст', 138 | "текст
    \n текст" 139 | ], [ 140 | 'текст http://yandex.ru текст', 141 | 'текст http://yandex.ru текст' 142 | ], [ 143 | 'текст http://yandex.ru текст', 144 | 'текст http://yandex.ru текст' 145 | ], [ 146 | 'текст http://yandex.ru/?a=href&title=test!..', 147 | 'текст http://yandex.ru/?a=href&title=test!..' 148 | ], [ 149 | 'текст ftp://yandex.ru!..', 150 | 'текст ftp://yandex.ru!..' 151 | ], [ 152 | 'текст
    • текст
    • текст
    • текст
    текст', 153 | "текст
      \n
    • текст
    • \n
    • текст
    • \n
    \n текст" 154 | ], [ 155 | 'текст
  • текст
  • текст
  • текст', 156 | 'текст текст текст текст' 157 | ], [ 158 | '"текст" текст "текст "текст" текст" "..."', 159 | '«текст» текст «текст „текст“ текст» «...»' 160 | ], [ 161 | '
    "текст" текст "текст "текст" текст" "..."
    ', 162 | '
    "текст" текст "текст "текст" текст" "..."
    ' 163 | ], [ 164 | 'текст ( ) * + , текст', 165 | 'текст ( ) * + , текст' 166 | ], [ 167 | 'текст - текст', 168 | 'текст — текст' 169 | ], [ 170 | 'текст текст', 171 | 'текст текст' 172 | ], [ 173 | 'текст #hash... #{tag name} текст', 174 | 'текст #hash... #tag name текст' 175 | ], [ 176 | 'текст #hashtag #taghash, #htag текст', 177 | 'текст #hashtag #taghash, #htag текст' 178 | ], [ 179 | 'текст текст текст', 180 | 'текст текст текст' 181 | ], [ 182 | 'текст текст текст', 183 | 'текст текст текст' 184 | ], [ 185 | 'текст текст текст', 186 | 'текст текст текст' 187 | ], [ 188 | 'текст текст текст', 189 | 'текст текст текст' 190 | ], [ 191 | 'текст текст текст', 192 | 'текст текст текст' 193 | ], [ 194 | 'текст текст текст', 195 | 'текст текст текст' 196 | ], [ 197 | 'текст текст текст', 198 | 'текст текст текст' 199 | ], [ 200 | 'текст текст текст текст', 201 | 'текст текст текст текст' 202 | ], [ 203 | 'текст