在我的php应用程序中,用户可以输入标签(就像问问题一样)。 我假设它将是regexp,我使用了一个 - mb_split('\ W +',$ text) - 用非单词字符分割。
但我希望允许用户输入“ - ,_,+,#”等字符,这些字符在url中是有效的并且很常见。
有没有解决方案,或者可能是最好的实践?
感谢。
答案 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
修饰符添加到正则表达式。