2011-07-04 19 views
1

私はいくつかの既製コードを使用していますが、implode &を使ってタグを写真に割り当てました。あなたが2ワードのタグを試したように、それを分割していたようなものです。 私は見つけた正規表現を使ってexplog関数をpreg_split関数に置き換えましたが、関数&の正規表現http://php.fnlist.com/regexp/preg_splitをテストしても、タグが正しく分割されていることがわかります。preg_split()とimplode()newbie help please(正しいタグをしようとしています)

私は「犯罪、愛、ミステリー、犯罪ドラマ、ロマンス」 きれいにフォーマットされたタグなどの入力から、取得しようとしています:「犯罪、愛、ミステリー、犯罪ドラマ、ロマンス」と私が代わりに取得: 「犯罪、愛、謎、ロマンス "

私は以下のコードを与えています。 助けてください!

<?php 
class PhotoTagsController extends AppController { 
var $name = 'PhotoTags'; 

var $uses = array('PhotoTag', 'Photo'); 

function edit($id = null) 
{ 
$this->authorize(); 

    if(!($photo = $this->Photo->findById($id))) 
    { 
    $this->flash('error', ucfirst(i18n::translate('photo not found'))); 
    $this->redirect('/'); 
    } 
    else 
    { 
    $this->authorize($photo['Photo']['user_id']); 

    $this->set('photo', $photo); 

    if(empty($this->data)) 
    { 
     $photo['Photo']['tags'] = array(); 
     foreach($photo['PhotoTag'] as $tag) 
     $photo['Photo']['tags'][] = $tag['tag']; 
     $photo['Photo']['tags'] = implode(',', $photo['Photo']['tags']); 

     $this->data = $photo; 
    } 
    else 
    { 

    // foreach(explode(',', $this->data['Photo']['tags']) as $tag) 


    foreach(preg_split("/[s]*[,][ s]*/", $this->data['Photo']['tags']) as $tag) 

     { 
     $tag = strtolower(rtrim($tag)); //trims whitespace at end of tag 
     if(!empty($tag)) 
     { 
      $found = false; 

      for($i = 0; $i < count($photo['PhotoTag']); $i++) 
      { 
      if(isset($photo['PhotoTag'][$i]) && $photo['PhotoTag'][$i]['tag'] == $tag) 
      { 
       $found = true; 
       unset($photo['PhotoTag'][$i]); 
       break; 
      } 
      } 

      if(!$found) 
      { 
      $this->PhotoTag->create(); 
      $this->PhotoTag->save(array('PhotoTag' => array('photo_id' => $photo['Photo']['id'], 'tag' => $tag))); 
      } 
     } 
     } 

     foreach($photo['PhotoTag'] as $tag) 
     $this->PhotoTag->delete($tag['id']); 

     $this->flash('valid', ucfirst(i18n::translate('tags changed'))); 
     $this->redirect('/photos/show/' . $photo['User']['username'] . '/' . $photo['Photo']['id']); 
    } 
    } 
} 

function ajax_edit($id = null) { 
$this->authorize(); 

if(!($photo = $this->Photo->findById($id))) 
{ 
    die(); 
} 
else 
{ 
    $this->authorize($photo['Photo']['user_id']); 

// foreach(explode(',', $this->params['form']['value']) as $tag) 

foreach(preg_split("/[s]*[,][ s]*/", $this->params['form']['value']) as $tag) 

    { 
    $tag = strtolower(rtrim($tag)); 
    if(!empty($tag)) 
    { 
     $found = false; 

     for($i = 0; $i < count($photo['PhotoTag']); $i++) 
     { 
     if(isset($photo['PhotoTag'][$i]) && $photo['PhotoTag'][$i]['tag'] == $tag) 
     { 
      $found = true; 
      unset($photo['PhotoTag'][$i]); 
      break; 
     } 
     } 

     if(!$found) 
     { 
     $this->PhotoTag->create(); 
     $this->PhotoTag->save(array('PhotoTag' => array('photo_id' => $photo['Photo']['id'], 'tag' => $tag))); 
     } 
    } 
    } 

    foreach($photo['PhotoTag'] as $tag) 
    $this->PhotoTag->delete($tag['id']); 

    echo $this->params['form']['value']; 

    die(); 
} 
} 
} 
?> 
+0

問題を理解するために必要なすべてのコードはありますか?関連コードのみを含めてください。 –

+0

このコードサンプルのほとんどは無関係です。問題を引き起こしているキーワード処理部分のみを表示して、「綿毛」を編集できますか? –

+0

あなたの正規表現 '[s] * [、] [s] *'は、0文字以上の文字 's'にマッチし、その後にカンマが続き、その後に0以上の[スペースまたは文字s]が続きます。 '\ s'は"スペース文字 "を意味します。スラッシュは重要です。そして、 '[]'は単一の文字の周りには必要ありません。それらは文字セットを表します。おそらく、あなたは正規表現をブラッシュアップするべきでしょうか? – mpen

答えて

0

にごpreg_split正規表現を変更します。私はあなたがオーバー物事を複雑にしようとしていると思います

/(\s+)?,(\s+)?/ 

それとも...

/\s*,\s*/ 
+0

なぜ '\ s *、\ s *'ではないのですか? – mpen

+0

あなたは*を使うことができます。しかし、私は貪欲な管理の欠如のために*を使うのを避ける傾向があります! :p –

+0

?あなたがそれを嫌うなら '\ s *? 'をします。デフォルトでは、それは貪欲で、可能な限り多くのスペースを消費します。 – mpen

0

。コンマで区切りたい場合は、単純なexplode()関数を使用してください。 trim()を使って空白を取り除くことができます。

$parts = explode(',', $input_string); 
foreach ($parts as $value) { 
    $results[] = trim($value); 
} 
+0

私がコメントしたスクリプトにも同様の爆発がありました...うまくいかなかったのです。 私の主な目的は、2つ以上の単語タグ(別々のタグに分割しない)を許可することです。 考えていますか? – Lina

+0

次に、strtolower()とarray_unique()を組み合わせて使用​​します。 – jjwdesign

関連する問題