2009-02-10 37 views
5

Trong người dùng ứng dụng php của tôi có thể nhập các thẻ (như ở đây khi đặt câu hỏi). Tôi cho rằng nó sẽ là regexp và tôi đã sử dụng một - mb_split ('\ W +', $ text) - để phân tách bằng các ký tự không phải từ.cách tốt nhất để tạo/chia chuỗi thành các thẻ

Nhưng tôi muốn cho phép người dùng nhập các ký tự như "-, _, +, #" v.v ... là những ký tự hợp lệ nằm trong url và phổ biến.

Có các giải pháp thoát cho điều này hoặc có thể là các thiết bị tốt nhất không?

cảm ơn.

Trả lời

23

Sử dụng chức năng explode() và phân tách bằng dấu cách hoặc dấu phẩy. Ví dụ:

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

người dùng sẽ nhập "?" tính cách? nó sẽ phá vỡ url – waney

+0

Nó không nên phá vỡ url. – VirtuosiMedia

+0

Đừng quên urlencode() BẤT K user người dùng nhập vào. Điều này sẽ ngăn chặn '#' và '?' từ việc phá vỡ URL. – matpie

9

Chia nhỏ khoảng trắng \s+ để thay thế.

3

Tách trên \ s + (khoảng trắng) thay vì \ W + (không phải chữ và số).

2

Tôi cho rằng đầu tiên bạn có thể thử để làm sạch chuỗi trước khi chia tách nó thành các thẻ:

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

Bạn có thể có thể áp dụng một cách tiếp cận danh sách trắng này là tốt, và khá có ký tự bạn chấp nhận được liệt kê trong mẫu của bạn.

2

Bạn đã nói rằng bạn muốn nó hoạt động giống như trình gắn thẻ stackoverflow. Trình gắn thẻ này chia tách chúng bằng ký tự khoảng trắng "".

Nếu bạn muốn điều này là hành vi của bạn là tốt, chỉ cần sử dụng:

mb_split('\s+', $text) 

thay vì:

mb_split('\W+', $text) 

Chúc may mắn!

0

Sử dụng 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. 

nếu thẻ ở dạng UTF-8, hãy thêm u công cụ sửa đổi vào regexp.

1

tôi sử dụng smart_explode này() chức năng để phân tích thẻ trong ứng dụng của tôi:

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

Nó phát nổ một chuỗi $ vào một mảng bằng cách sử dụng $ người khai phá như một tách (thường là một dấu phẩy), loại bỏ các nhân đôi, Trims không gian xung quanh các thẻ, và thậm chí sắp xếp các thẻ cho bạn nếu $ sort là 'sort'. Nó sẽ trả về một mảng trống khi không có gì nằm trong chuỗi $.

Việc sử dụng cũng giống như:

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

trên sẽ trở lại:

array ('PHP', 'regEx') 

Để lọc các ký tự mà bạn không thích, làm một

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

trước smart_exploding (liệt kê các ký tự "xấu" trong mảng để được thay thế bằng dấu gạch dưới).

1

Cách tiếp cận đúng để xử lý thẻ tùy thuộc vào tùy chọn của bạn khi xử lý dữ liệu nhập: Bạn có thể xóa hoàn toàn thẻ không hợp lệ hoặc thử và xóa thẻ để chúng hợp lệ.

Phương pháp tiếp cận danh sách trắng để xác định các ký tự hợp lệ nên được sử dụng để làm sạch đầu vào - có quá nhiều ký tự có vấn đề với danh sách đen.

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

Cách tiếp cận đầu tiên loại bỏ thẻ không hợp lệ hoàn toàn:

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

Cách tiếp cận thứ hai cố gắng để làm sạch các thẻ:

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

Thay thế ký tự bất hợp pháp với khoảng trắng dẫn đến các vấn đề đôi khi - cho ví dụ ở trên "str & ing" được chuyển thành "str ing". Loại bỏ các ký tự không hợp lệ hoàn toàn sẽ dẫn đến "chuỗi", trong đó hữu ích hơn trong một số trường hợp.

Các vấn đề liên quan