2015-02-09 609 views
2

我試圖檢查一個字符串是否以PHP中的'€'或'£'開頭。檢查字符串是否以歐元/英鎊符號開頭

下面是

$text = "€123"; 

    if($text[0] == "€"){ 
     echo "true"; 
    } 
    else{ 
     echo "false"; 
    } 

    //output false 

如果只檢查單個字符,它工作正常

$symbol = "€"; 

    if($symbol == "€"){ 
     echo "true"; 
    } 
    else{ 
     echo "false"; 
    } 
    // output true 

我也曾嘗試打印在瀏覽器中的字符串代碼。

$text = "€123"; 
echo $text; //display euro symbol correctly 
echo $text[0] //get a question mark 

我曾嘗試使用substr(),但發生了同樣的問題。

+0

由於多字節字符的編碼,它顯示爲問號。 – Darren 2015-02-09 23:36:06

回答

0

字符,如'€'或'£'是多字節字符。有一篇很好的文章,你可以read here。根據PHP docs,PHP字符串是字節數組。因此,使用數組括號訪問或修改字符串不是多字節安全的,只能使用單字節編碼的字符串(如ISO-8859-1)來完成。

還要確保您的文件使用UTF-8編碼:您可以使用文本編輯器(如NotePad ++)將其轉換。

如果我減少PHP這一點,它的工作原理,關鍵是使用mb_substr:

<?php 
    header ('Content-type: text/html; charset=utf-8'); 
    $text = "€123"; 
    echo mb_substr($text,0,1,'UTF-8'); 
?> 

最後,這將是一個好主意,添加UTF-8元標記在你的腦袋標籤:

<meta charset="utf-8"> 
1

我建議這是最簡單的解決方案。使用htmlentities()將這些符號轉換爲它們的unicode標識符。

htmlentities($text, ENT_QUOTES, "UTF-8"); 

這要麼給你&pound;&euro;。現在,您可以運行switch() {case:}語句來檢查。 (或者你的if語句)

$symbols = explode(";", $text); 

switch($symbols[0]) { 
    case "&pound": 
     echo "It's Pounds"; 
     break; 
    case "&euro": 
     echo "It's Euros"; 
     break; 
} 

Working Example

1

這是因爲你使用其中兩個€和£使用多個字節記錄多字節字符編碼(可能是UTF-8)。這意味着"€"是一個字符串三個字節,而不僅僅是一個。

當您使用$text[0]你得到只是第一個字節的第一個字符的,所以它不匹配3個字節的"€"。您需要先取得前三個字節,以檢查一個字符串是否以另一個字符串開頭。

這裏是我用來做功能:

function string_starts_with($string, $prefix) { 
    return substr($string, 0, strlen($prefix)) == $prefix; 
} 

出現問號,因爲"€"第一個字節是不夠的,編碼所有文字:錯誤是由'可用時表示, 除此以外 '?'。

相關問題