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

时间:2015-02-09 23:25:07

标签: php string special-characters

我正在尝试检查字符串是否以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(),但发生了同样的问题。

3 个答案:

答案 0 :(得分:1)

我建议这是最简单的解决方案。使用htmlentities()将符号转换为其unicode标识符。

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

哪个会为您提供£€。现在,您可以运行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 :(得分:1)

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

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

这是我用来做的功能:

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

出现问号是因为"€"的第一个字节不足以编码整个字符:错误在可用时用' '表示,否则'?'。

答案 2 :(得分:0)

字符,例如'€'或'£'是多字节字符。有一篇很棒的文章,你可以read here。根据{{​​3}},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">