-1

可能重复:
如果单词包含特定字符串,则删除整个单词

如何删除包含单词的整个单词?例如,'releas' 应该删除已发布、发布等。

/* Read in from the file here, not in the function - you only need to read the file once */
$wordlist = array('release','announce');

/* Sample data */
$words = 'adobe releases releases Acrobat X';

foreach ($wordlist as $v)
      $words = clean($v,$words);

function clean($wordlist,$value)
{
        return preg_replace("/\b$wordlist\b/i", '***',trim($value));
}  

echo 'Words: '.$words.PHP_EOL;
4

3 回答 3

3

我会使用这个 REGEXP;

return preg_replace("/\w*$wordlist\w*/i", '***', trim($value));

应用于您的代码,它将是:

foreach ($wordlist as $v)
  $words = clean($v, $words);

function clean($word, $value) {
    return preg_replace("/\w*$word\w*/i", '***',trim($value));
}

(请注意,我重命名$wordlist$word以使事情更清楚,因为$wordlist它也是数组的名称)

于 2013-01-02T08:26:17.610 回答
3

你可以循环通过你的$wordlist

function clean($wordlist,$value)
{
    foreach ($wordlist as $word) {
        $value = preg_replace("/\b\w*$word\w*\b/i", '***', trim($value));
    }

    return $value;
}  

并一次性完成

function clean($wordlist,$value)
{
    $all_words = implode('|', $wordlist);
    return preg_replace("/\b\w*(?:$all_words)\w*\b/i", '***', trim($value));
}

更新

浏览其他答案和评论,似乎我没有正确看待这个问题。如果$wordlist不是数组,您可以使用@fthiella 的答案。

于 2013-01-02T08:28:49.587 回答
0

试试这种方式

$_words = implode( '|', $wordlist );

return preg_replace( "/\b\w*{$_words}\w*\b/i", "***", trim( $value ) );

或更好

$_words = array();
foreach ( $wordlist as $word ) {
    $_words[] = '/\b\w*' . preg_quote( $word ) . '\w*\b/i';
}

return preg_replace( $_words, '***', trim( $value ) );

第二种方法避免了正则表达式的问题,如果一些保留字符出现在单词中。

于 2013-01-02T08:30:59.730 回答