php preg_match_all有£符号和UTF-8的问题

时间:2013-08-19 16:43:25

标签: php utf-8 preg-match-all

我与this question有类似的问题。我从另一项服务中得到一份文本,其中包含'开始---£144.23 ---£151.23 ---请在2013年6月25日之前支付161.23英镑---结束',我想解析。

这是我的脚本(包含上面序列的文本由$text表示,逐行排列句子):

$myText = utf8_decode(implode(' --- ', $text));
$myExtract = return_between($myText, 'BEGIN', 'END', EXCL);
$allGBP = parse_array(myExtract, '£', ' ');

使用2个功能:

return_between基本上是strpos和substr的组合,并在'BEGIN'和'END'之间返回提取。

function parse_array($string, $beg_tag, $close_tag)
{
    preg_match_all("($beg_tag(.*)$close_tag)siU", $string, $matching_data);
    return $matching_data[0];
}

在wamp上脚本工作,$ allGBP是一个包含'£144.23','£151.23'和'£161.23'的数组。在我的服务器上,脚本不起作用,$ allGBP为空。 $allGBP = parse_array(myExtract, '£', ' ');也不起作用。

看起来UTF-8在某些时候被破坏并且抛出了preg_match_all(基于我发现的另一个问题)但是我很困惑为什么这只会发生在服务器上而不是在wamp上。如果我在开始时移除utf8_decode,则£符号将变为£。

有什么建议吗?

编辑:以防万一:在wamp和server上都是PHP5.3。

1 个答案:

答案 0 :(得分:0)

在指示中:

preg_match_all("($beg_tag(.*)$close_tag)siU", $string, $matching_data);

更改分隔符

preg_match_all("/$beg_tag(.*)$close_tag/siU", $string, $matching_data);