2010-09-16 9 views
15

Tôi muốn đại diện cho các chuỗi như màu sắc tùy ý html.Làm cách nào để chuyển đổi chuỗi thành mã băm mã màu html?

Ví dụ:

"blah blah" = # FFCC00
"foo foo 2" = # 565656

Nó không có vấn đề gì các mã màu thực tế là, chừng đó là một thập lục phân hợp lệ Mã màu HTML và toàn bộ phổ được trình bày khá tốt.

Tôi đoán bước đầu tiên là thực hiện MD5 trên chuỗi và sau đó bằng cách nào đó chuyển đổi thành mã màu thập lục phân?

Cập nhật: Ví dụ sử dụng là tạo báo cáo trực quan về các yêu cầu tệp trên máy chủ. Những màu sắc không cần phải trông đẹp, nó càng nhiều để một bộ não con người có thể phát hiện các mẫu, vv trong dữ liệu dễ dàng hơn.

+0

Bạn có muốn để ánh xạ một chuỗi mã hex 6 chữ số? – codaddict

+0

Bạn có thể cho ví dụ về cách bạn sẽ sử dụng các chuỗi này không? Tại sao bạn không đặt các mã màu trong các biến php? – Mischa

+1

đi với suy nghĩ của codaddict: băm nó và mất 6 byte đầu tiên? – russau

Trả lời

30

Cám ơn các con trỏ, điều này dường như làm một công việc có thẩm quyền:

function stringToColorCode($str) { 
    $code = dechex(crc32($str)); 
    $code = substr($code, 0, 6); 
    return $code; 
} 

$str = 'test123'; 
print '<span style="background-color:#'.stringToColorCode($str).'">'.$str.'</span>'; 
+0

chính xác giải pháp tôi đang tìm kiếm. –

+1

Một khái niệm tương tự nhưng băm khác nhau đã được cung cấp ở đây: http://stackoverflow.com/questions/15704220/change-random-strings-into-colours-consistently Đối với tôi, nó dường như cung cấp một sự kết hợp màu sắc đa dạng hơn. Có lẽ sự phân bố của băm là khác nhau đối với md5() vs dechex (crc32()) – kane

+0

Hoàn hảo. Nó hoạt động tuyệt vời! Cảm ơn bạn. – Steffi

16

Hầu như mọi khi, chỉ sử dụng màu sắc ngẫu nhiên sẽ

  1. trông xấu
  2. mâu thuẫn với nền

tôi sẽ khuyên bạn nên tạo một (hơi dài) danh sách các màu sắc mà làm việc tốt với nhau và với nền của bạn - sau đó chỉ cần tổng hợp các giá trị char của chuỗi và mô đun (%) với số lượng màu của bạn để có được một chỉ mục trong bảng.

+1

Đây là câu trả lời hay nhất. Bạn nên bao gồm một hàm cho nó được hoàn thành. – Heroselohim

16

Tôi đồng ý với sje397 ở trên rằng màu sắc hoàn toàn ngẫu nhiên có thể sẽ trông khó chịu. Thay vì tạo ra một danh sách dài các màu sắc đẹp, tôi sẽ đề nghị chọn một giá trị độ bão hòa không đổi + phát quang và thay đổi màu sắc dựa trên nội dung. Để có được màu RGB từ màu HSL, bạn có thể sử dụng một cái gì đó tương tự như những gì được mô tả trong http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB.

Dưới đây là một ví dụ (thử nó trong http://codepad.viper-7.com một cái gì đó mà làm việc, chẳng hạn như https://codepad.remoteinterview.io/ZXBMZWYJFO):

<?php 

function hsl2rgb($H, $S, $V) { 
    $H *= 6; 
    $h = intval($H); 
    $H -= $h; 
    $V *= 255; 
    $m = $V*(1 - $S); 
    $x = $V*(1 - $S*(1-$H)); 
    $y = $V*(1 - $S*$H); 
    $a = [[$V, $x, $m], [$y, $V, $m], 
      [$m, $V, $x], [$m, $y, $V], 
      [$x, $m, $V], [$V, $m, $y]][$h]; 
    return sprintf("#%02X%02X%02X", $a[0], $a[1], $a[2]); 
} 

function hue($tstr) { 
    return unpack('L', hash('adler32', $tstr, true))[1]; 
} 

$phrase = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; 
$words = []; 
foreach (explode(' ', $phrase) as $word) 
    $words[hue($word)] = $word; 
ksort($words); 
foreach ($words as $h => $word) { 
    $col = hsl2rgb($h/0xFFFFFFFF, 0.4, 1); 
    printf('<span style="color:%s">%s</span> ', $col, $word); 
} 
?> 
+4

Với đoạn mã, đây sẽ là câu trả lời hay nhất – iwein

+0

Đã thêm đoạn mã. – Reinderien

+0

Lỗi phân tích cú pháp PHP: lỗi cú pháp, bất ngờ '[' sau $ a vì phiên bản PHP cũ. – hozza

0

Tôi nghĩ tôi hiểu được mong muốn rất tốt. Tôi cũng muốn điều tương tự. Đang cố gắng để có được một màu nền độc đáo đại diện cho một tiêu đề. Tôi không muốn định trước bất cứ điều gì bản thân mình, tôi muốn để có được một băm trực quan cho mỗi tiêu đề, nhưng với khá-Ness. Tìm thấy điều này để làm công việc khá tốt. Bạn có thể sửa đổi độ sáng của màu sắc và các biến thể của độ sáng. Bạn chỉ cần kiểm tra nó với màu sắc bạn cảm thấy thoải mái. Tôi nghĩ bất kỳ màu nào cũng tốt cho công việc này, chỉ có độ sáng mới phân biệt được nó với nền trước.

https://mrkmg.com/blog/2012/01/13/php-function-to-generate-a-color-from-a-text-string/

Cho nó một chuỗi, độ sáng tối thiểu (0-255) và phương sai (2-10) và nó sẽ tạo ra một màu sắc cho chuỗi của bạn. Điều này có thể cung cấp cho bạn màu sắc đẹp nếu tinh chỉnh.

+0

Liên kết bị hỏng :( – Jerry

2

Một lót:

substr(md5($string), 0, 6);