2011-07-05 150 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