2011-07-05 146 views
-1

以下函数将一些单词分解到一个数组中,调整空格并执行其他我需要的操作。我还需要删除破折号,因为我也将它们写成单词。但是这个函数不会删除破折号。怎么了?无法从字符串中删除破折号( - )

function stripwords($string) 
{ 
    // build pattern once 
    static $pattern = null; 
    if ($pattern === null) { 
    // pull words to remove from somewhere 
    $words = array('alpha', 'beta', '-'); 
    // escape special characters 
    foreach ($words as &$word) { 
     $word = preg_quote($word, '#'); 
    } 
    // combine to regex 
    $pattern = '#\b(' . join('|', $words) . ')\b\s*#iS'; 
    } 

    $print = preg_replace($pattern, '', $string); 
    list($firstpart)=explode('+', $print); 
    return $firstpart; 

} 
+0

'$ pattern'看起来像什么? –

+0

它是一种宣传,而不是破折号。破折号是: - – Buddy

+0

你可以举一个不能按预期工作的例子吗? – Gumbo

回答

1

要回答你的问题,问题是指定字边界的\b。如果在连字符之前或之后有一个空格,它将不会像“ - ”中那样将其删除,但字边界不适用。

http://www.regular-expressions.info/wordboundaries.html

有迹象表明,有资格作为单词边界的三个不同位置 :

  1. 在 字符串的第一个字符之前,如果第一个字符是一个 单词字符。如果最后的 字符是字符字符,
  2. 之间的两个字符串,其中 一个是单词字符,而另一个是 不是一个单词字符。

“单词字符”是一个可用于形成单词的字符。

一个简单的办法:

通过增加与\b您模式沿\s和使用正隐藏的外观和积极的前瞻,你应该能够解决你的问题。

$pattern = '#(?<=\b|\s|\A)(' . join('|', $words) . ')(?=\b|\s|\Z)\s*#iS'; 
+0

以及如何处理空格和复合词?那是...我需要那个“阿尔法”被剥去当只有一个单词......而不是alphabeta(复合词,例子) – smepie

+0

什么是我的正确模式到这个功能? – smepie

+0

@smepie - 我已经更新了上面的正则表达式,以便使用积极的前瞻性和积极的look-behind来查找单词边界和空间。它也不完美,因为如果它是最后一个字符或者一个单词以短划线开头或结尾,它不会删除短划线。 –

0

没有在你的正则表达式模式中找到破折号。为什么不只是做

$string = str_replace('-', '', $string); 

当你做你的正则表达式的东西?

+0

已经尝试过......也许弗朗索瓦是正确的 – smepie