PHP额外的空格未被删除

时间:2014-09-18 16:21:16

标签: php regex

我在计算文章中的单词并删除常用单词,例如"和"或""。 我通过使用preg_replace

删除它们

完成后,我会使用。

快速清理额外的空白区域
$search_body = preg_replace('/\s+/',' ',$search_body);

然而,我有一些非常顽固的白色空间,不会消失。我试过了

if($word == "" OR $word == " "){
  //chop it's head off
}

但if语句没有看到$ word只是空格。我也尝试将其打印到屏幕上以获取它的原始数据类型,它仍然只显示空白。

这是我正在使用的完整正则表达式。

$pattern = array(   
        '/\&quot\;/',
        '/[0-9]/',
        '/\,/',
        '/\./',
        '/\!/',
        '/\@/',
        '/\#/',
        '/\$/',
        '/\%/',
        '/\^/',
        '/\&/',
        '/\*/',
        '/\(/',
        '/\)/',
        '/\_/',
        '/\"/',
        '/\'/',
        '/\:/',
        '/\;/',
        '/\?/',
        '/\`/',
        '/\~/',
        '/\[/',
        '/\]/',
        '/\{/',
        '/\}/',
        '/\|/',
        '/\+/',
        '/\=/',
        '/\-/',
        '/–/',
        '/°/',
        '/\bthe\b/',
        '/\band\b/',
        '/\bthat\b/',
        '/\bhave\b/',
        '/\bfor\b/',
        '/\bnot\b/',
        '/\bwith\b/',
        '/\byou\b/',
        '/\bthis\b/',
        '/\bbut\b/',
        '/\bhis\b/',
        '/\bfrom\b/',
        '/\bthey\b/',
        '/\bsay\b/',
        '/\bher\b/',
        '/\bshe\b/',
        '/\bwill\b/',
        '/\bone\b/',
        '/\ball\b/',
        '/\bwould\b/',
        '/\bthere\b/',
        '/\btheir\b/',
        '/\bwhat\b/',
        '/\bout\b/',
        '/\babout\b/',
        '/\bwho\b/',
        '/\bget\b/',
        '/\bwhich\b/',
        '/\bwhen\b/',
        '/\bmake\b/',
        '/\bcan\b/',
        '/\blike\b/',
        '/\btime\b/',
        '/\bjust\b/',
        '/\bhim\b/',
        '/\bknow\b/',
        '/\btake\b/',
        '/\bpeople\b/',
        '/\binto\b/',
        '/\byear\b/',
        '/\byour\b/',
        '/\bgood\b/',
        '/\bsome\b/',
        '/\bcould\b/',
        '/\bthem\b/',
        '/\bsee\b/',
        '/\bother\b/',
        '/\bthan\b/',
        '/\bthen\b/',
        '/\bnow\b/',
        '/\blook\b/',
        '/\bonly\b/',
        '/\bcome\b/',
        '/\bits\b/', //it's?
        '/\bover\b/',
        '/\bthink\b/',
        '/\balso\b/',
        '/\bback\b/',
        '/\bafter\b/',
        '/\buse\b/',
        '/\btwo\b/',
        '/\bhow\b/',
        '/\bour\b/',
        '/\bwork\b/',
        '/\bfirst\b/',
        '/\bwell\b/',
        '/\bway\b/',
        '/\beven\b/',
        '/\bnew\b/',
        '/\bwant\b/',
        '/\bbecause\b/',
        '/\bany\b/',
        '/\bthese\b/',
        '/\bgive\b/',
        '/\bday\b/',
        '/\bmost\b/',
        '/\bare\b/',
        '/\bwas\b/',
        '/\<\w+\>/', '/\<\/\w+\>/',
        '/\b\w{1}\b/', //1 letter word
        '/\b\w{2}\b/', //2 letter word
        '/\//',
        '/\</',       
        '/\>/'
        );

$search_body    = strip_tags($body);
$search_body    = strtolower($search_body);
$search_body    = preg_replace($pattern, ' ', $search_body);
$search_body    = preg_replace('/\s+/',' ',$search_body);
$search_body    = explode(" ", $search_body);

当爆炸的空白值显示为左右

我使用的示例文字太长,无法在此处发布。但我复制并粘贴了 This article给它一个测试,它显示了32个空白计数,即使在使用trim()之后也不包括其他单词前面或后面的空格。

Here's a js.fiddle of the raw data that is being handled by php.

htmlentities和htmlspecialchars也没有显示任何内容。

这里的代码统计所有值并将它们合二为一。

$inhere     = array();
$body_hold  = array();
foreach($search_body as $value){
  $value = trim($value);
  if(in_array($value, $inhere) && $value != ""){
    $key = array_search($value, $inhere);
    $body_hold[$key]['count'] = $body_hold[$key]['count']+1;
  }elseif($value != ""){
    $inhere[] = $value;
    $body_hold[] = array(
      'count'  => 1,
      'word'   => $value
    );
  }
}
rsort($body_hold);

看待价值观的基本预言。

foreach($body_hold as $value){
  $count  = $value['count'];
  $word   = trim($value['word']);
  echo "Count: ".$count;
  echo " Word: ".$word;
  echo '<br>';
}

Here's a PHP example of what it's returning

2 个答案:

答案 0 :(得分:1)

您确定在js.fiddle中输入了正在处理的完全相同的数据吗?或者您是否从后续的后处理步骤中获得了它?

这显然是维基百科的一篇文章。我在维基百科上看了那篇文章并在编辑模式下打开它,看到原始wiki文本中有&s;&nbsp; s。但是,这些不会出现在您的js.fiddle数据中。

TL; DR:检查&amp; nbsp;在你的处理(并转换为空格等)。

答案 1 :(得分:0)

这个角色160看起来像空间但不是,将所有角色替换为常规空间(32),然后移除所有双重空格将解决您的问题。

$search_body = str_replace(chr(160), chr(32), $search_body);
$search_body = trim(preg_replace('/\s+/', ' ', $search_body));