{"id":21744635,"url":"https://github.com/cdoco/xfilter","last_synced_at":"2025-04-13T05:12:15.746Z","repository":{"id":85206011,"uuid":"136707296","full_name":"cdoco/xfilter","owner":"cdoco","description":":loop: 关键词过滤扩展, 用于检查一段文本中是否出现敏感词, 基于 Double-Array Trie 树实现。","archived":false,"fork":false,"pushed_at":"2018-06-25T04:32:25.000Z","size":51,"stargazers_count":30,"open_issues_count":0,"forks_count":10,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-26T22:04:44.464Z","etag":null,"topics":["c","filter","php","php7-extension","trie","xfilter"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cdoco.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-09T08:58:32.000Z","updated_at":"2022-10-20T09:53:05.000Z","dependencies_parsed_at":"2023-07-28T00:00:23.915Z","dependency_job_id":null,"html_url":"https://github.com/cdoco/xfilter","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdoco%2Fxfilter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdoco%2Fxfilter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdoco%2Fxfilter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdoco%2Fxfilter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cdoco","download_url":"https://codeload.github.com/cdoco/xfilter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248665743,"owners_count":21142123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","filter","php","php7-extension","trie","xfilter"],"created_at":"2024-11-26T07:12:10.530Z","updated_at":"2025-04-13T05:12:15.740Z","avatar_url":"https://github.com/cdoco.png","language":"C","readme":"[![Build Status][travis-image]][travis-url]\n![libdatrie](https://img.shields.io/badge/libdatrie-%3E%3D0.2.4-blue.svg)\n![PHP](https://img.shields.io/badge/PHP-%3E%3D7.0.0-blue.svg)\n![xfilter](https://img.shields.io/badge/branch-master-brightgreen.svg)\n![License](https://img.shields.io/badge/license-PHP/3.01-blue.svg)\n\n\u003e 关键词过滤扩展，用于检查一段文本中是否出现敏感词，基于 `Double-Array Trie` 树实现。\n\n## 依赖环境\n\n- PHP 7 +\n- libdatrie (Version \u003e= 0.2.4)\n\n## 安装\n\n因为本项目依赖于 `libdatrie`, 所以需要先安装 [libdatrie](https://github.com/tlwg/libdatrie), 再安装本扩展。\n\n```shell\n$ wget https://github.com/tlwg/libdatrie/releases/download/v0.2.11/libdatrie-0.2.11.tar.xz\n$ tar zxvf libdatrie-0.2.11.tar.xz\n$ cd libdatrie-0.2.11\n$ ./configure \u0026\u0026 make \u0026\u0026 make install\n```\n\nPS: `libdatrie` 依赖于 `libiconv`, 如果编译的时候报 `undefined reference to libiconv`, 你需要先安装 `libiconv`。如果安装完还有错误可以执行这个命令 `./configure LDFLAGS=-L/usr/local/lib LIBS=-liconv`。\n\n```shell\n$ git clone https://github.com/cdoco/xfilter.git \u0026\u0026 cd xfilter\n$ phpize \u0026\u0026 ./configure \u0026\u0026 make \u0026\u0026 make install\n```\n\n你可以在 `php.ini` 中设置字典文件的路径, 如果你不想在 `php.ini` 中设置你也可以在 `setFileName` 方法中设置。\n\n```ini\n[xfilter]\nextension=xfilter.so\n\n// 你可以在这里设置加载的字典文件路径\nxfilter.filename=/path/to/xfilter/blackword.dic\n```\n\n## 示例\n\n```php\n\u003c?php\n\nuse Cdoco\\Filter;\n\n// 这个方法里可以传入词典的路径或者在 php.ini 中设置\nFilter::setFileName(__DIR__ . '/blackword.dic');\n\n// 保存敏感词到字典文件中\nFilter::save(['敏感词', '高子航', 'xfilter']);\n\n// 搜索字符串中的敏感词 会返回敏感词的起始位置和长度\n$rs = Filter::search('这是一个敏感词测试语句, 由高子航创造, xfilter, By ZiHang Gao。');\n\n// Array\n// (\n//     [0] =\u003e Array\n//         (\n//             [0] =\u003e 12\n//             [1] =\u003e 9\n//         )\n//\n//     [1] =\u003e Array\n//         (\n//             [0] =\u003e 38\n//             [1] =\u003e 9\n//         )\n//\n//     [2] =\u003e Array\n//         (\n//             [0] =\u003e 55\n//             [1] =\u003e 7\n//         )\n//\n// )\nprint_r($rs);\n```\n\n## 方法\n\n#### setFileName\n\n该方法可以传入一个敏感词的字典文件路径。\n\n```php\nFilter::setFileName(string $filename);\n\n// 示例\nFilter::setFileName(__DIR__ . '/blackword.dic');\n```\n\n#### save\n\n保存一个敏感词数组到字典文件中, 如果在 `setFileName` 方法中设置了路径, 会优先使用 `setFileName` 方法中的路径, 如果没有会使用 `php.ini` 中设置的 `xfilter.filename`。\n\n```php\nboolean Filter::save(array $blackword [, boolean $append = false]);\n\n// 示例\nFilter::save(['敏感词', '高子航', 'xfilter'], true);\n```\n\n`save` 方法有两个参数, 第一个参数 `$blackword` 是一个敏感词的数组, 第二个参数 `$append` 用来表示是否是追加写入。\n\n```php\n\u003c?php\n\nuse Cdoco\\Filter;\n\nFilter::setFileName(__DIR__ . '/blackword.dic');\n\nFilter::save(['xfilter']);\n$rs = Filter::search('xfilter, By ZiHang Gao。');\n\n// Array\n// (\n//     [0] =\u003e Array\n//         (\n//             [0] =\u003e 0\n//             [1] =\u003e 7\n//         )\n//\n// )\nprint_r($rs);\n\n// 不设置 $append 参数 save 方法会重新建立一个文件\nFilter::save(['cdoco']);\n$rs = Filter::search('xfilter, By ZiHang Gao。');\n\n// Array\n// (\n// )\nprint_r($rs);\n\n// 如果设置了 $append 为 true, save 方法会在之前字典的基础上追加敏感词\nFilter::save(['xfilter'], true);\n$rs = Filter::search('cdoco, By ZiHang Gao。');\n\n// Array\n// (\n//     [0] =\u003e Array\n//         (\n//             [0] =\u003e 0\n//             [1] =\u003e 5\n//         )\n//\n// )\nprint_r($rs);\n```\n\n#### search\n\n搜索一个字符串中是否包含敏感词。\n\n```php\narray Filter::search(string $text);\n\n// 示例\nFilter::search('这是一个敏感词测试语句, 由高子航创造, xfilter, By ZiHang Gao。');\n```\n\n`search` 方法会返回一个二维数组, 包含敏感词出现的位置和长度, 你可以用 `substr` 方法截取出敏感词。\n\n```php\nArray\n(\n    [0] =\u003e Array\n        (\n            [0] =\u003e 0 //敏感词出现的位置\n            [1] =\u003e 5 //敏感词的长度\n        )\n\n)\n\n\u003c?php\n\nuse Cdoco\\Filter;\n\n// 截取字符串\n$content = '这是一个敏感词测试语句, 由高子航创造, xfilter, By ZiHang Gao。';\n$rs = Filter::search($content);\n\nforeach ($rs as $v) {\n    echo substr($content, $v[0], $v[1]) . \"\\n\";\n}\n\n// 敏感词\n// 高子航\n// xfilter\n```\n\n#### delete\n\n删除字典文件中的敏感词。\n\n```php\nboolean Filter::delete(string $keyword);\n\n// 示例\nFilter::delete('高子航');\n```\n\n## 感谢\n\n@wulijun 的 `trie-filter` 扩展已不维护更新, 目前使用起来有点繁琐。这个项目是根据自己的想法, 在 [trie-filter](https://github.com/wulijun/php-ext-trie-filter) 的基础上修改而来, 感谢 @wulijun。\n\n## License\n\nPHP License. See the [LICENSE](LICENSE) file.\n\n[travis-url]: https://travis-ci.org/cdoco/xfilter\n[travis-image]: https://travis-ci.org/cdoco/xfilter.svg\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdoco%2Fxfilter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcdoco%2Fxfilter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdoco%2Fxfilter/lists"}