Joomla PHP 使用文本文件将单词列入黑名单
Joomla PHP using a text file to blacklist words
所以我的 joomla 根路径中有一个名为 banned.txt
的文本文档,内容如下所示(换行):
fuck
fucking
etc
现在我已经用下面的代码解决了这个问题。但是,与其在我的 php 代码中有一大堆数组,我宁愿以某种方式从我的 public_html
文件夹中的文本文档中提取被禁止的词。
$mtitle = $file['name'];
$find = array('fuck', 'fucking', 'etc');
foreach ($find as $n) {
if(strpos($mtitle,$n) !== false) {
$this->setError(JText::_('Banned word detected'));
return false;
}
}
任何帮助提取 c:/website/public_html/banned.txt
并检查该文件以查看是否有任何单词匹配的帮助都很好 :)
Com_contact 包含三个用于过滤特定字符串(电子邮件、主题行和消息)的规则,您可以在此处找到它们 https://github.com/joomla/joomla-cms/tree/staging/components/com_contact/models/rules.
您应该在您的组件中做的(假设您不想仅仅指望加载这些规则)是创建您自己的规则并将其放在文件层次结构中的相同位置。查看 com_contact 以了解如何使单词可配置以及如何将其添加到表单定义中。
file
不适合您的目的吗?我们可以在 PHP documentation:
中读到
file — Reads entire file into an array
因此使用 file
您的代码将如下所示:
$mtitle = $file['name'];
$find = file("c:/website/public_html/banned.txt",FILE_IGNORE_NEW_LINES);
foreach ($find as $n) {
if(strpos($mtitle,$n) !== false) {
$this->setError(JText::_('Banned word detected'));
return false;
}
}
请注意,只有定义 $find
的行发生了变化,因为 file
正在返回数组。
编辑:
似乎 file
正在拆分文件,但仍附加换行符。要忽略它们,您必须使用 FILE_IGNORE_NEW_LINES
作为第二个参数。我已更新代码以包含它。
Each line in the resulting array will include the line ending, unless
FILE_IGNORE_NEW_LINES is used, so you still need to use rtrim() if you
do not want the line ending present.
使用 Windows OS 执行以下操作似乎对我有用。在 banned.txt 中,我用新行分隔了每个禁用词。
Banned.txt :
fuck
fucking
etc
PHP :
$mtitle = $file['name'];
//$find = array('fuck', 'fucking', 'etc');
$find = explode("\r\n", file_get_contents("c:/website/public_html/banned.txt"));
foreach ($find as $n) {
if(strpos($mtitle,$n) !== false) {
$this->setError(JText::_('Banned word detected'));
return false;
}
}
如果有人有任何改进或发现我在使用此代码时遇到任何问题,请务必说明,我们感谢您提供改进方面的帮助。
所以我的 joomla 根路径中有一个名为 banned.txt
的文本文档,内容如下所示(换行):
fuck
fucking
etc
现在我已经用下面的代码解决了这个问题。但是,与其在我的 php 代码中有一大堆数组,我宁愿以某种方式从我的 public_html
文件夹中的文本文档中提取被禁止的词。
$mtitle = $file['name'];
$find = array('fuck', 'fucking', 'etc');
foreach ($find as $n) {
if(strpos($mtitle,$n) !== false) {
$this->setError(JText::_('Banned word detected'));
return false;
}
}
任何帮助提取 c:/website/public_html/banned.txt
并检查该文件以查看是否有任何单词匹配的帮助都很好 :)
Com_contact 包含三个用于过滤特定字符串(电子邮件、主题行和消息)的规则,您可以在此处找到它们 https://github.com/joomla/joomla-cms/tree/staging/components/com_contact/models/rules.
您应该在您的组件中做的(假设您不想仅仅指望加载这些规则)是创建您自己的规则并将其放在文件层次结构中的相同位置。查看 com_contact 以了解如何使单词可配置以及如何将其添加到表单定义中。
file
不适合您的目的吗?我们可以在 PHP documentation:
file — Reads entire file into an array
因此使用 file
您的代码将如下所示:
$mtitle = $file['name'];
$find = file("c:/website/public_html/banned.txt",FILE_IGNORE_NEW_LINES);
foreach ($find as $n) {
if(strpos($mtitle,$n) !== false) {
$this->setError(JText::_('Banned word detected'));
return false;
}
}
请注意,只有定义 $find
的行发生了变化,因为 file
正在返回数组。
编辑:
似乎 file
正在拆分文件,但仍附加换行符。要忽略它们,您必须使用 FILE_IGNORE_NEW_LINES
作为第二个参数。我已更新代码以包含它。
Each line in the resulting array will include the line ending, unless FILE_IGNORE_NEW_LINES is used, so you still need to use rtrim() if you do not want the line ending present.
使用 Windows OS 执行以下操作似乎对我有用。在 banned.txt 中,我用新行分隔了每个禁用词。
Banned.txt :
fuck
fucking
etc
PHP :
$mtitle = $file['name'];
//$find = array('fuck', 'fucking', 'etc');
$find = explode("\r\n", file_get_contents("c:/website/public_html/banned.txt"));
foreach ($find as $n) {
if(strpos($mtitle,$n) !== false) {
$this->setError(JText::_('Banned word detected'));
return false;
}
}
如果有人有任何改进或发现我在使用此代码时遇到任何问题,请务必说明,我们感谢您提供改进方面的帮助。