检查字符串是否以欧元/英镑符号开头

检查字符串是否以欧元/英镑符号开头

问题描述:

我试图检查一个字符串是否以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

字符,如'€'或'£'是多字节字符。有一篇很好的文章,你可以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"> 

我建议这是最简单的解决方案。使用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

这是因为你使用其中两个€和£使用多个字节记录多字节字符编码(可能是UTF-8)。这意味着"€"是一个字符串三个字节,而不仅仅是一个。

当您使用$text[0]你得到只是第一个字节的第一个字符的,所以它不匹配3个字节的"€"。您需要先取得前三个字节,以检查一个字符串是否以另一个字符串开头。

这里是我用来做功能:

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

出现问号,因为"€"第一个字节是不够的,编码所有文字:错误是由'可用时表示, 除此以外 '?'。