检查字符串是否以 euro/pound 符号开头
check if the string begin with euro/pound symbol
我正在尝试检查 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()
,但还是出现了同样的问题。
“€”或“£”等字符是多字节字符。有一篇优秀的文章可以read here. According to the PHP docs,PHP strings are byte arrays。因此,使用数组括号访问或修改字符串不是多字节安全的,只能对采用单字节编码(例如 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 charset="utf-8">
我建议您将此作为最简单的解决方案。使用 htmlentities()
.
将符号转换为其 unicode 标识符
htmlentities($text, ENT_QUOTES, "UTF-8");
哪个会给你 £
或 €
。现在允许您以 运行 一个 switch() {case:}
语句来检查。 (或您的 if 语句)
$symbols = explode(";", $text);
switch($symbols[0]) {
case "£":
echo "It's Pounds";
break;
case "&euro":
echo "It's Euros";
break;
}
发生这种情况是因为您使用的是多字节字符编码(可能是 UTF-8),其中 € 和 £ 都是使用多个字节记录的。这意味着 "€"
是一个 三个 字节的字符串,而不仅仅是一个。
当您使用 $text[0]
时,您只会得到第一个字符的 第一个字节 ,因此它与 [=11] 的三个字节不匹配=].您需要改为获取前三个字节,以检查一个字符串是否以另一个字符串开头。
这是我用来执行此操作的函数:
function string_starts_with($string, $prefix) {
return substr($string, 0, strlen($prefix)) == $prefix;
}
出现问号是因为"€"
的第一个字节不足以编码一个完整的字符:可用时用'�'表示错误,否则用'?'表示错误。
我正在尝试检查 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()
,但还是出现了同样的问题。
“€”或“£”等字符是多字节字符。有一篇优秀的文章可以read here. According to the PHP docs,PHP strings are byte arrays。因此,使用数组括号访问或修改字符串不是多字节安全的,只能对采用单字节编码(例如 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 charset="utf-8">
我建议您将此作为最简单的解决方案。使用 htmlentities()
.
htmlentities($text, ENT_QUOTES, "UTF-8");
哪个会给你 £
或 €
。现在允许您以 运行 一个 switch() {case:}
语句来检查。 (或您的 if 语句)
$symbols = explode(";", $text);
switch($symbols[0]) {
case "£":
echo "It's Pounds";
break;
case "&euro":
echo "It's Euros";
break;
}
发生这种情况是因为您使用的是多字节字符编码(可能是 UTF-8),其中 € 和 £ 都是使用多个字节记录的。这意味着 "€"
是一个 三个 字节的字符串,而不仅仅是一个。
当您使用 $text[0]
时,您只会得到第一个字符的 第一个字节 ,因此它与 [=11] 的三个字节不匹配=].您需要改为获取前三个字节,以检查一个字符串是否以另一个字符串开头。
这是我用来执行此操作的函数:
function string_starts_with($string, $prefix) {
return substr($string, 0, strlen($prefix)) == $prefix;
}
出现问号是因为"€"
的第一个字节不足以编码一个完整的字符:可用时用'�'表示错误,否则用'?'表示错误。