Php preg_split()和Inclode()请新手帮助(尝试正确操作标签)

Php preg_split()和Inclode()请新手帮助(尝试正确操作标签),php,tags,implode,preg-split,Php,Tags,Implode,Preg Split,我正在使用一些现成的代码,它使用内爆和分解功能为照片分配标签,用户输入的标签。 但它做得不对,就像你尝试了一个两个单词的标签,它正在拆分它。 因此,我用一个preg_split函数替换了explode函数,并找到了一个正则表达式,但即使测试函数®ex on表明它正确地拆分了标记,在我的应用程序中,它完全忽略了任何两个单词标记 我试图从犯罪、爱情、神秘、犯罪剧、浪漫等方面获取信息 格式精美的标签:犯罪、爱情、神秘、犯罪剧、浪漫,取而代之的是: 犯罪、爱情、神秘、浪漫 我给出了下面的代码。 请

我正在使用一些现成的代码,它使用内爆和分解功能为照片分配标签,用户输入的标签。 但它做得不对,就像你尝试了一个两个单词的标签,它正在拆分它。 因此,我用一个preg_split函数替换了explode函数,并找到了一个正则表达式,但即使测试函数®ex on表明它正确地拆分了标记,在我的应用程序中,它完全忽略了任何两个单词标记

我试图从犯罪、爱情、神秘、犯罪剧、浪漫等方面获取信息 格式精美的标签:犯罪、爱情、神秘、犯罪剧、浪漫,取而代之的是: 犯罪、爱情、神秘、浪漫

我给出了下面的代码。 请帮忙

   <?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();
 }
}
}
?>
将preg_split正则表达式更改为:

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

/\s*,\s*/
将preg_split正则表达式更改为:

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

/\s*,\s*/

我觉得你想把事情复杂化。如果要按逗号分割,只需使用更简单的分解函数。然后可以使用“修剪”去除空白

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

我觉得你想把事情复杂化。如果要按逗号分割,只需使用更简单的分解函数。然后可以使用“修剪”去除空白

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


是否需要所有的代码来理解您的问题?请仅包含相关代码。此代码示例中的大多数代码都是不相关的-您是否可以编辑掉绒毛并仅显示导致问题的关键字处理部分?您的正则表达式[s]*[,][s]*匹配0个或多个字母s,后跟逗号,后跟0个或多个[空格或字母s]s\s表示空格字符。斜杠很重要。单个字符周围不需要[]。它们代表一个字符集。也许你们应该复习一下正则表达式?嗨,伙计们。非常感谢。他们的关键代码是:foreachpreg_split/[s]*[,][s]*/,$this->data['Photo']['tags']作为$tag,foreachpreg_split/[s]*[,][s]*/,$this->params['form']['value']作为$tag,我想给出整个上下文,但不确定会有多大帮助。我其实不知道正则表达式,我正试图把我在网上找到的东西拼凑起来,我试过的正则表达式被认为是用于我想要的确切目的。另外,用在线工具测试,结果是正确的。不知道为什么它不起作用。您建议使用什么正则表达式来正确拆分标记,将两个或多个单词标记放在一块中?是否需要所有代码来理解您的问题?请仅包含相关代码。此代码示例中的大多数代码都是不相关的-您是否可以编辑掉绒毛并仅显示导致问题的关键字处理部分?您的正则表达式[s]*[,][s]*匹配0个或多个字母s,后跟逗号,后跟0个或多个[空格或字母s]s\s表示空格字符。斜杠很重要。单个字符周围不需要[]。它们代表一个字符集。也许你们应该复习一下正则表达式?嗨,伙计们。非常感谢。他们的关键代码是:foreachpreg_split/[s]*[,][s]*/,$this->data['Photo']['tags']作为$tag,foreachpreg_split/[s]*[,][s]*/,$this->params['form']['value']作为$tag,我想给出整个上下文,但不确定会有多大帮助。我其实不知道正则表达式,我正试图把我在网上找到的东西拼凑起来,我试过的正则表达式被认为是用于我想要的确切目的。另外,用在线工具测试,结果是正确的。不知道为什么它不起作用。您建议使用什么正则表达式来正确拆分标记,将两个或多个单词标记放在一块中?您可以使用*。。。然而,由于缺乏贪婪的管理,我倾向于避免使用*:呸?如果您想让它解除冻结,您可以\s*?。默认情况下,它是贪婪的,将消耗尽可能多的空间。尝试了这两个建议,但不幸的是没有工作。我想允许两个或多个单词标记不将它们拆分为单独的标记。我该怎么做?非常感谢。你可以用*。。。然而,由于缺乏贪婪的管理,我倾向于避免使用*:呸?如果您想让它解除冻结,您可以\s*?。默认情况下,它是贪婪的,将消耗尽可能多的空间。尝试了这两个建议,但不幸的是没有工作。我想允许两个或多个单词标记不将它们拆分为单独的标记。我该怎么做?非常感谢。在我注释掉的脚本中也有类似的爆炸…它不起作用。我的主要目标是允许两个或多个单词标记不分割成单独的标记。有什么想法吗?然后使用strtolower和array_unique的组合。在我注释掉的脚本中也有类似的爆炸…它不起作用。我的主要目标是允许两个或多个单词标记不分割成单独的标记。有什么想法吗?然后使用strtolower和array_unique的组合。