2009-02-10 2 views
5

В моем приложении php пользователь может ввести теги (например, здесь, когда задавать вопрос). Я предполагаю, что это будет регулярное выражение, и я использовал один - mb_split ('\ W +', $ text) - для разбиения на не-словные символы.лучший способ создать/разделить строку на теги

Но я хочу разрешить пользователям вводить символы типа «-, _, +, #» и т. Д., Которые являются действительными для URL-адреса и являются общими.

Есть ли решения для этого или могут быть лучшими практиками?

спасибо.

ответ

23

Используйте функцию explode() и разделите ее пробелами или запятыми. Пример:

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

Что пользователь вводит "?" персонаж? он сломал url – waney

+0

Он не должен нарушать URL. – VirtuosiMedia

+0

Не забудьте указать urlencode() ЛЮБОЙ пользовательский ввод. Это предотвратит «#» и «?». от разрыва URL-адреса. – matpie

3

Разделить на \ s + (пробелы) вместо \ W + (не буквенно-цифровой).

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

Вы могли бы принять белый список подход к этому, как хорошо, и лучше иметь символы вы принимаете перечисленные в вашем шаблоне.

2

Вы сказали, что хотите, чтобы он работал как теггер stackoverflow. Этот теггер разделяет их пробельным символом «».

Если вы хотите, чтобы это было ваше поведение, а просто использовать:

mb_split('\s+', $text) 

вместо:

mb_split('\W+', $text) 

Удачи!

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 модификатор к регулярному выражению.

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 как разделитель (обычно запятая), удаляет дублированные, обрезает пробелы вокруг тегов и даже сортирует теги для вас, если $ sort является «sort». Он вернет пустой массив, когда в строке $ ничего не будет.

Использование, как:

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

выше Вернет:

array ('PHP', 'regEx') 

Для фильтрации символов вам не нравится, сделать

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

перед тем smart_exploding (перечисляя «плохие» символы в массиве, чтобы заменить его на символ подчеркивания).

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 & ing» преобразуется в «str ing». Удаление незаконных символов полностью приведет к «строке», которая в некоторых случаях более полезна в .

Смежные вопросы