【问题标题】:Replace Exact Occurrence of Word in PHP?替换PHP中单词的确切出现?
【发布时间】:2013-08-26 10:58:15
【问题描述】:

我需要从文章中反复删除某些停用词。目前我正在使用函数 str_replace 来实现这一点。作为第一个参数,我使用停止列表数组变量来删除任何出现的停止词。这很好用,除了它还会删除出现在单词中间的任何匹配项(即,如果停用词是“th”,它将从“the”、“then”等中删除“th”)。

现在,如果我使用纯文本提供参数,我可以在单词的两侧添加一个空格来纠正这种情况。但是,由于我使用的是变量数组,所以这不起作用。我也尝试使用连接运算符,但这似乎不是函数内的合法连接器。

当前代码如下所示:

$i = str_replace(" " . $swarray . " ", $string );

【问题讨论】:

  • “停用词”通常假定您想在此文本中进行搜索,并且并不真正关心实际文本本身。这个假设正确吗?在这种情况下,我会使用一种完全不同的方法,使用strtok 并在之后清除数组元素(或者......如果它们匹配,则根本不添加它们)。这比从一个大字符串中一个一个地切割子字符串要快很多倍。
  • 嗯,是的,我想对文本进行搜索和做其他事情,就好像停用词不存在一样..
  • 对于“其他事情”,您可能需要没有停用词的完整文本,但对于搜索,我会说将strtok文本放入数组并丢弃停用词更有效.从大字符串中删除许多小片段会重复复制大量内存。

标签: php


【解决方案1】:

您需要使用带有字边界的preg_replace。例如下面我们只替换单词the,同时避免替换themthen

$string = preg_replace('/\bthe\b/', '', $string);

【讨论】:

  • 谢谢。我可以用数组变量替换“the”吗?如果不是,它就违背了整个目的。
  • @user1926567:是的,您可以在 preg_replace 中使用数组。见Example #2php.net/manual/en/function.preg-replace.php
  • 我目前的语法是:$i = preg_replace('/\b$swarray\b/', '', $string);但是,当我回显它时,这只会返回原始字符串。
  • 实际上您需要将\b 包装在您的模式数组的每个元素中。请仔细查看链接页面上的示例。
  • 这是我试图避免的,因为这会非常乏味。
【解决方案2】:

preg_replacearray

$find = array('/\bth\b/', '/\bthe\b/', '/\bthen\b/');
$replace = array('', '', '');

echo $i = preg_replace($find, $replace, $string);

或者

$find = array('/\bth\b/', '/\bthe\b/', '/\bthen\b/');

echo $i = preg_replace($find, "", $string);

正则匹配文档:http://www.php.net/manual/en/function.preg-replace.php#89364

\b Match a word boundary

【讨论】:

  • 你很接近,但只要目标词在其他两个词之间,你的答案就会产生 2 个空格。
  • 可以加preg_replace('/\s+/', ' ',$string);
【解决方案3】:

这应该可行:

$i = $string;
foreach($swarray as $word) {
  $i = str_replace(" " . $word . " ", "", $i );
}

【讨论】:

  • 第一个词还是最后一个词怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-06
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多