如何捕捉Marz /März/März?

时间:2010-11-26 16:28:00

标签: php html regex unicode utf-8

我正试图在用德语写的文本中找到这个月。 (在html文件中)

3月写的是“März”。

我想确定我抓住它所以我检查

马兹, 马兹, M&安培; AUML; RZ

我尝试使用此代码

if(preg_match("/ma?ä?(ä)?rz/i", $title))
    return 3;

它适用于前两个,但不适用于& auml;。 我做错了什么?

(HTML和我的PHP文件以UTF8编码)

4 个答案:

答案 0 :(得分:3)

为什么不尝试

(Marz|März|März)

答案 1 :(得分:3)

您必须首先解码实体,然后使用与Unicode Collation Algorithm一起使用的比较。例如,这适用于Perl:

use Unicode::Collate;

my $Collator = Unicode::Collate->new(normalization => undef, level => 1);
my $str = "Ich muß Perl studieren.";
my $sub = "MÜSS";
my $match;
if (my($pos,$len) = $Collator->index($str, $sub)) {
    $match = substr($str, $pos, $len);
}

根据您希望进行的level比较,可以匹配带有和不带标记的东西。

你如何在PHP中执行这样的基本Unicode操作我不知道,但我认为必须有一个相应的库,考虑到这些类型的东西是必要的。

答案 2 :(得分:2)

ä不止一个字节或类似的东西 - 你必须这样做:

preg_match("/ma?(ä)?(ä)?rz/i", $title);

You can see it here

此外,Kengs方法更好。

答案 3 :(得分:1)

如果仅用于搜索目的,但用于返回单词的实际位置,则可以使用html_entity_decode()iconv()对搜索字符串进行规范化:

$string = html_entity_decode($string, ENT_QUOTES, "utf-8");
$string = iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", $string);

// then search for "Marz"