为什么这个测试用例不起作用?
// cards with cyrillic inidices and suits in UTF-8 encoding
$a = array('7♠', 'Д♠', 'К♠', '8♦', 'В♦', 'Д♦', '10♣', '10♥', 'В♥', 'Т♥');
foreach ($a as $card) {
$suit = substr($card, -1);
$card = preg_replace('/(\d+)♥/', '$1♥', $card);
$card = preg_replace('/(\d+)♦/', '$1♦', $card);
$card = preg_replace('/(\d+)♠/', '$1♠', $card);
$card = preg_replace('/(\d+)♣/', '$1♣', $card);
printf("suit: %s, html: %s\n", $suit, $card);
}
?>
输出:
suit: ▒, html: 7♠
suit: ▒, html: Д♠
suit: ▒, html: К♠
suit: ▒, html: 8♦
suit: ▒, html: В♦
suit: ▒, html: Д♦
suit: ▒, html: 10♣
suit: ▒, html: 10♥
suit: ▒, html: В♥
suit: ▒, html: Т♥
即我在PHP脚本中遇到2个问题:
为什么最后一个UTF-8字符不能正确提取?
为什么只用preg_replace代替第一诉讼?
使用PHP 5.3.3,PostgreSQL 8.4.12在CentOS 6.2上保留UTF-8 JSON(带有俄语文本和卡片套)。
如果1.是PHP 5.3.3中的错误,那么有没有好的解决方法? (我不想升级库存包)。
更新:
$a = array('7♠', 'Д♠', 'К♠', '8♦', 'В♦', 'Д♦', '10♣', '10♥', 'В♥', 'Т♥');
foreach ($a as $card) {
$suit = mb_substr($card, -1, 1, 'UTF-8');
$card = preg_replace('/(\d+)♥/u', '$1♥', $card);
$card = preg_replace('/(\d+)♦/u', '$1♦', $card);
$card = preg_replace('/(\d+)♠/u', '$1♠', $card);
$card = preg_replace('/(\d+)♣/u', '$1♣', $card);
printf("suit: %s, html: %s\n", $suit, $card);
}
?>
新的输出:
suit: ♠, html: 7♠
suit: ♠, html: Д♠
suit: ♠, html: К♠
suit: ♦, html: 8♦
suit: ♦, html: В♦
suit: ♦, html: Д♦
suit: ♣, html: 10♣
suit: ♥, html: 10♥
suit: ♥, html: В♥
参考方案
substr是朴素的PHP核心功能之一,它假定1个字节= 1个字符。 substr(..., -1)从字符串中提取最后一个字节。但是“♠”长于一个字节。您应该改用mb_substr($card, -1, 1, 'UTF-8')。
您需要将u (PCRE_UTF8) modifier添加到正则表达式中,以使其正确处理UTF-8编码的表达式和字符串:
preg_replace('/(\d+)♥/u', ...
PHP-全局变量的性能和内存问题 - php
假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…PHP strtotime困境 - php
有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00…php-casperjs获取内部文本 - php
我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…php:拆分字符串,直到第一次出现数字 - php
我有像cream 100G sup 5mg Children 我想在第一次出现数字之前将其拆分。所以结果应该是array( array('cream','100G'), array('sup','5mg Children') ); 可以告诉我如何为此创建图案吗?我试过了list(…php getdate()-小时不正确 - php
我在iframe中将php用于计数器。我正在使用getdate();功能。我的当地时间不是下午12:16,如果我使用getdate();从php获取现在的本地时间,小时显示为13。我从php getdate()回答的值应该不是12吗?$d1=getdate(); $hournew=$d1['hours']; echo $hournew .…