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

3

我正在尝试在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(),但是出现了相同的问题。

由于多字节字符的编码方式,它显示为问号。 - Darren
3个回答

1

像'€'或'£'这样的字符是多字节字符。您可以在此处阅读一篇优秀的文章。根据PHP文档,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');
?>

最后,在您的head标签中添加UTF-8 meta标签是一个好主意。
<meta charset="utf-8"> 

太好了,我也遇到了同样的问题,导入了一些带有欧元或英镑符号的寄存器,因此每次在屏幕上显示时,都会出现双重符号,而mb_substr帮助我剪切了我需要的字符串部分。谢谢! - Oris Sin

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

工作示例


1
这是因为您使用了多字节字符编码(可能是UTF-8),其中€和£都使用多个字节记录。这意味着"€"是一个由三个字节组成的字符串,而不仅仅是一个字节。
当您使用$text [0]时,您只获取第一个字符的第一个字节,因此它与"€"的三个字节不匹配。您需要获取前三个字节,以检查一个字符串是否以另一个字符串开头。
这是我用来执行此操作的函数:
function string_starts_with($string, $prefix) {
    return substr($string, 0, strlen($prefix)) == $prefix;
}

问题标记出现的原因是 "€" 的第一个字节不足以编码整个字符:错误通过“�”指示,否则为“?”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接