为什么我尝试替换字符串中的字符失败?

时间:2012-08-11 15:41:24

标签: php regex character-encoding

我有一个字符串(如果它有任何不同,取自MySQL数据库)看起来很正常:

Manufacture: <a href="http://www.x.com/">Blah</a>

问题是Manufacture:<a>标记之间的空格是194,而不是32,正如我所料。

这导致preg_match具有以下模式失败(请忽略尝试使用正则表达式解析HTML,我知道这不是一个好主意,但这个特定的数据集可以预测到足以逃脱它):

/Manufacture: *(<a[^>]*>([A-Za-z- 0-9]+)<\/a>)/i

如果我用文本编辑器中的普通空格字符替换流氓空间并再试一次,表达式会按预期匹配,但我需要以编程方式更改它。

我尝试了str_replace

$text = str_replace(chr(194), ' ', $text);

preg_match仍然失败。然后我尝试了preg_replace

$text = preg_replace('/[\xC2]/', ' ', $text);

但这也不起作用,即使通过preg_match 运行相同的模式包含预期的匹配。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:4)

请问您可以检查MySQL表的结构,从中获取$ text的内容吗?如果排序规则为utf8_general_ci或类似,那么您的字符串很可能包含双字节UNICODE字符。

enter image description here

如果是这种情况,则PHP函数iconv应该可以解决问题。这是PHP手册中的示例。 IGNORE选项应从字符串中删除UNICODE字符。

<?php
$text = "This is the Euro symbol '€'.";

echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Plain    : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

?>

以上示例将输出类似于:

的内容
Original : This is the Euro symbol '€'.
TRANSLIT : This is the Euro symbol 'EUR'.
IGNORE   : This is the Euro symbol ''.
Plain    :
Notice: iconv(): Detected an illegal character in input string in .\iconv-example.php on line 7
This is the Euro symbol '

答案 1 :(得分:0)

如果您尝试匹配任何空白字符,该怎么办? 像这样:

/Manufacture:\s*(<a[^>]*>([A-Za-z- 0-9]+)<\/a>)/i