2011-07-05 18 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から

単語の境界としての資格3つの異なる位置 があります:最初の文字は 単語文字である場合 文字列の最初の文字の前に

  1. は、。
  2. 文字列内の最後の 文字の後に、最後の 文字が単語文字の場合。
  3. の間には、文字列内の2文字があります。 は、1つは単語文字、もう1つは は単語文字ではありません。

「単語文字」は、単語を構成するために使用できる文字です。

シンプルなソリューション:

あなたのパターンに\bとともに\sを追加し、正ビハインド外観と正の先読みを使用することにより、あなたはあなたの問題を解決することができるはずです。

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

で、空白と複合語のやり方は?それは...私は、 "アルファ"は、単一の単語だけが...アルファベットでないアルファ(複合語、例) – smepie

+0

は、この機能に私の正しいパターンは何ですか? – smepie

+0

@smepie - 上記の正規表現を更新して、肯定的な先読みと肯定的な裏返しを使用して単語境界とスペースを検索しました。最後の文字である場合や、単語がダッシュで開始または終了する場合は、ダッシュを削除しないので、完璧ではありません。 –

0

ダッシュを探している正規表現パターンはありません。なぜあなたはあなたの正規表現のものをした後に

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

あなたはあなたの正規表現のものをした後ですか?

+0

すでに試してみました...多分Francoisは – smepie

関連する問題