etiketleri / Split dize oluşturmak için en iyi yolu

8 Cevap php

In my php application user able to enter the tags(like here while ask question). I assume it will be regexp, and I used one - mb_split('\W+', $text) - to split by non-word characters.

"-, _, +, #" Vb url olması geçerli olanlar ve yaygın olan ama kullanıcılar gibi karakterleri girmek için izin istiyor.

Orada bu çözüm çıkarken, ya da en iyi practicles olabilir?

teşekkürler.

8 Cevap

explode() işlevini kullanın ve boşluk veya virgül biri tarafından ayrı. Örnek:

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

Boşluk tarafından bölünmüş \s+ yerine.

Yerine \ W + (non-alfanümerik) ve \ s + (boşluklarla) üzerine bölünmüş.

Ben ilk etiketleri bölerek önce dize kadar temizlemek için deneyebilirsiniz varsayalım:

# 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);

Muhtemelen de bu bir beyaz liste yaklaşım benimsemek ve yerine senin desen listelenmiş kabul karakter olabilir.

Eğer o stackoverflow etiketleyen kimse gibi çalışmak istediğini söyledi. Bu tagger boşluk karakteri "" onları böler.

Bu da sizin davranış olmak istiyorsanız, sadece kullanım:

mb_split('\s+', $text)

yerine:

mb_split('\W+', $text)

İyi şanslar!

Benim app etiketleri ayrıştırmak için bu smart_explode () işlevini kullanın:

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 ();
  }
}

Bu bir ayırıcı (genellikle virgül) olarak $ Patlatıcı kullanarak bir diziye bir $ dize patlar, çoğaltılamaz, etiketler etrafında boşluk düzeltir, ve $ sort 'tür' olduğu bile sizin için etiketleri sıralar kaldırır. Hiçbir $ dizge içinde olduğunda boş bir dizi döndürür.

Kullanımı gibi:

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

Yukarıdaki dönecektir:

array ('PHP', 'regEx')

Sevmediğiniz karakterler filtrelemek için, mutlaka yapın

 $mytaglist = str_replace (array ('?', '$', '%'), '_', $mytaglist);

smart_exploding önce (bir çizgi ile yerini almak için dizideki "kötü" karakter listesi).

Etiketleri işleme doğru yaklaşım girişi işleme üzerinde tercihlerine bağlıdır: Siz tamamen geçersiz etiketlerini kaldırmak, ya da denemek ve onlar geçerli olmak çok etiketleri temizlemek ya.

Geçerli karakterleri tanımlayan Beyaz Liste yaklaşım girişi temizliğinde kullanılmalıdır - Kara listeye çok sorunlu karakterler sadece vardır.

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='_+#-';

İlk yaklaşım tamamen geçersiz etiketleri kaldırır:

// 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;
}

İkinci yaklaşım etiketleri temizlemeye çalışır:

// 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);

Replacing illegal characters with whitespace leads to problems sometimes - for example the above "str&ing" is converted to "str ing". Removing the illegal characters entirely would result in "string", which is more useful in some cases.

Kullan 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.

sözcükler UTF-8 ise, regexp için u değiştirici eklemek.