我忙于尝试学习Drupal/PHP并遇到问题,我希望有人可以提供帮助。我已阅读其他类似帖子,但尝试解决方案尚未解决,因此提出了一个新问题。在字符串中匹配单词并在发现匹配的情况下替换整个单词
我正在尝试改编一个现有的Drupal模块(D7的wordfilter,dev发布),它将用替代方案替换任何亵渎实例。举例来说,如果一个给定的字符串包含要替换的字符串'word',那么我需要匹配整个单词,而不仅仅是违规字符,所以
'措辞经理得到了措辞。字!'
需要成为
'<deleted> <deleted> got <deleted>. <deleted>!'
,而不是
'<deleted>ing <deleted>er got <deleted>ed. <deleted>!'.
我到目前为止的代码有几个问题。首先,它只取代完全匹配,而不是整个单词。其次,我有一个分隔符和转义字符的问题。我已标记我在哪里认为问题与**问题1和**问题2.如果我错了,请让我知道。
通过发行2抛出的错误是
Warning: preg_replace(): Unknown modifier '$'
我认为这是与某些字符不正确转义做。我试图用换行符来包装$ pattern变量,所以它读取
$text = preg_replace('/' . $pattern . '/', "\${1}" . $replacement . "\${2}", $text);
但没有运气。正则表达式不匹配任何东西。这个问题可能与正则表达式本身有关,但我确定它是正确的。我正在使用的模式是
$pattern = '^(.*?(\B'word'\B)[^$]*)$';
但是'word'被包装在preq_quote调用中。
所以你去了。对于你们所有人来说,可能存在一大堆问题来撕碎碎片。我相信你们都可以闻到血液:-)如果我需要重写整个功能,那就这样吧。如果这是一个快速解决方案,那么更好。如果我错过了任何东西,或者想要更多信息,请告诉我,我将编辑该问题以包含它。我会非常感谢任何帮助,就像我说的那样,我将这种方法作为学习练习,因此欢迎所有(建设性)批评。
/**
* hook_filter process operation callback.
*/
function wordfilter_filter_process($text) {
//dpm($text);
$text = ' ' . $text . ' ';
$list = _wordfilter_list();
$utf8 = variable_get('wordfilter_use_utf8_flag', FALSE);
$case_sensitive = variable_get('wordfilter_process_case_sensitive', FALSE);
$default_replacement = variable_get('wordfilter_default_replacement', '[filtered word]');
//dpm($list);
foreach ($list as $word) {
// Prevent mysterious empty value from blowing away the node title.
if (!empty($word->words)) {
$replacement = ($word->replacement) ? $word->replacement : $default_replacement;
if ($replacement == '<none>') {
$replacement = '';
}
if ($word->standalone) {
$pattern = '/(\W)' . preg_quote($word->words, '/') . '(\W)/';
}
else { //**issue 1
//$pattern = '/' . preg_quote($word->words, '/') . '/';
$pattern = '^(.*?(\B' . preg_quote($word->words, '/') . '\B)[^$]*)$';
}
if (!$case_sensitive) {
$pattern .= 'i';
}
if ($utf8) {
$pattern .= 'u';
}
$split_text = preg_split('/(<[^>]*>)/i', drupal_substr($text, 1, -1), -1, PREG_SPLIT_DELIM_CAPTURE);
$split_text = array_values(array_filter($split_text));
if (count($split_text) > 1) {
$new_string = '';
foreach ($split_text as $part) {
if (!preg_match('/^</', $part)) {
//dpm($part);
$new_string .= preg_replace($pattern, "\${1}" . $replacement . "\${2}", $part);
//$new_string .= preg_replace($pattern, $replacement, $part);
}
else {
$new_string .= $part;
}
}
}
else { //**issue 2
$text = preg_replace($pattern, "\${1}" . $replacement . "\${2}", $text);
//$text = preg_replace($pattern, $replacement, $text);
}
}
}
$text = drupal_substr($text, 1, -1);
return $text;
}
的[ “坏词语” 过滤器]可能的复制(http://stackoverflow.com/questions/24515/bad-words-filter)欺骗标志 –
的目标应该是此http://计算器.com/questions/273516/how-do-you-implement -a-good-profanity-filter –