我一开始在 php 中使用 preg_replace 出现了一些疯狂的失败,并将其归结为使用土耳其语加点“i”和不加点“ı”在一起的多个字符类的问题案例。这是一个简单的php测试用例:
<?php
echo 'match single normal i: ';
$str = 'mi';
echo (preg_match('!m[ıi]!', $str)) ? "ok\n" : "fail\n";
echo 'match single undotted ı: ';
$str = 'mı';
echo (preg_match('!m[ıi]!', $str)) ? "ok\n" : "fail\n";
echo 'match double normal i: ';
$str = 'misir';
echo (preg_match('!m[ıi]s[ıi]r!', $str)) ? "ok\n" : "fail\n";
echo 'match double undotted ı: ';
$str = 'mısır';
echo (preg_match('!m[ıi]s[ıi]r!', $str)) ? "ok\n" : "fail\n";
?>
在 perl 中再次使用相同的测试用例:
#!/usr/bin/perl
$str = 'mi';
$str =~ m/m[ıi]/ && print "match single normal i\n";
$str = 'mı';
$str =~ m/m[ıi]/ && print "match single undotted ı\n";
$str = 'misir';
$str =~ m/m[ıi]s[ıi]r/ && print "match double normal i\n";
$str = 'mısır';
$str =~ m/m[ıi]s[ıi]r/ && print "match double undotted ı\n";
前三个测试工作正常。最后一个不匹配。
为什么这作为一个字符类一次可以正常工作,但在同一个表达式中第二次就不行了?我如何编写一个表达式来匹配这样的单词,无论它是用什么字母组合编写的,都需要匹配?
编辑:我正在尝试编程的语言问题的背景。
编辑 2:添加use utf8;
指令确实修复了 perl 版本。由于我最初的问题是一个 php 程序,我只切换到 perl 来查看它是否是 php 中的一个错误,这对我没有多大帮助。有人知道使 PHP 不会因此而窒息的指令吗?