创建/拆分字符串到标签的最佳方法

时间:2009-02-10 00:45:27

标签: php regex

在我的php应用程序中,用户可以输入标签(就像问问题一样)。 我假设它将是regexp,我使用了一个 - mb_split('\ W +',$ text) - 用非单词字符分割。

但我希望允许用户输入“ - ,_,+,#”等字符,这些字符在url中是有效的并且很常见。

有没有解决方案,或者可能是最好的实践?

感谢。

8 个答案:

答案 0 :(得分:23)

使用explode()功能并用空格或逗号分隔。例如:

$string = 'tag1 tag-2 tag#3';
$tags = explode(' ', $string); //Tags will be an array

答案 1 :(得分:9)

按空格\s+拆分。

答案 2 :(得分:3)

拆分\ s +(空格)而不是\ W +(非字母数字)。

答案 3 :(得分:2)

我想你可以先把字符串清理干净,然后再把它分成标签:

# List characters that you would want to exclude from your tags and clean the string
$exclude = array( '/[?&\/]/', '/\s+/');
$replacements = array('', ' '); 
$tags = preg_replace($exclude, $replacements,  $tags);

# Now split:
$tagsArray = explode(' ', $tags);

您也可以采用白名单方法,而不是在您的模式中列出您接受的字符。

答案 4 :(得分:2)

你说你想让它像stackoverflow标记一样工作。这个标记器用空白字符“”分割它们。

如果您希望这也是您的行为,只需使用:

mb_split('\s+', $text)

而不是:

mb_split('\W+', $text)
祝你好运!

答案 5 :(得分:1)

我使用这个smart_explode()函数来解析我的应用程序中的标签:

function smart_explode ($exploder, $string, $sort = '') {
  if (trim ($string) != '') {
    $string = explode ($exploder, $string);
    foreach ($string as $i => $k) {
      $string[$i] = trim ($k);
      if ($k == '') unset ($string[$i]);
    }
    $u = array_unique ($string);
    if ('sort' == $sort) sort ($u);
    return $u;
  } else {
    return array ();
  }
}

它使用$ exploder作为分隔符(通常是逗号)将$ string分解为数组,删除重复的内容,修剪标记周围的空格,如果$ sort为'sort',甚至可以为您排序标记。当$ string内没有任何内容时,它将返回一个空数组。

用法如下:

$mytaglist = smart_explode (',', '  PHP,  ,,regEx ,PHP');

以上将返回:

array ('PHP', 'regEx')

要过滤您不喜欢的字符,请执行

 $mytaglist = str_replace (array ('?', '$', '%'), '_', $mytaglist);
<_>在smart_exploding之前(列出数组中的“坏”字符以替换为下划线)。

答案 6 :(得分:1)

处理代码的正确方法取决于您对处理输入的偏好:您可以完全删除无效代码,也可以尝试清除代码以使其生效。

用于定义有效字符的白名单方法应该用于清理输入 - 黑名单中存在太多有问题的字符。

mb_internal_encoding('utf8');

$tags= 'to# do!"¤ fix-this str&ing';
$allowedLetters='\w';
// Note that the hyphen must be first or last in a character class pattern,
// to match hyphens, instead of specifying a character set range
$allowedSpecials='_+#-';

第一种方法完全删除无效标签:

// The first way: Ignoring invalid tags

$tagArray = mb_split(' ', $tags);

$pattern = '^[' . $allowedLetters . $allowedSpecials . ']+$';

$validTags = array();
foreach($tagArray as $tag)
{
    $tag = trim($tag);
    $isValid = mb_ereg_match($pattern, $tag);
    if ($isValid)
        $validTags[] = $tag;
}

第二种方法试图清除标签:

// The second way: Cleaning up the tag input

// Remove non-whitelisted characters
$pattern = '[^' . $allowedLetters . $allowedSpecials .']';

$cleanTags = mb_ereg_replace($pattern, ' ', $tags);

// Trim multiple white spaces.
$pattern = '\s+';
$cleanTags = mb_ereg_replace($pattern, ' ', $cleanTags);

$tags = mb_split(' ',$cleanTags);

用空格替换非法字符会导致问题 有时 - 例如,上述“str&amp; ing”被转换为“str ing”。 完全删除非法字符将导致“字符串”,这 在某些情况下更有用。

答案 7 :(得分:0)

使用preg_match_all

$tags = array();
if(preg_match_all('/\s*(.*)\s*/U',$tags)) unset($tags[0]);
//now in $tags you have an array of tags. 

如果标签是UTF-8,请将u修饰符添加到正则表达式。