0

我对字符“é”有疑问。

ftp_nlist($this->ftpStream, $directory); 我有一个像'Parté.mp4'这样的字符串,但'é'与正则表达式不匹配[\p{L}]*\.mp4

这里有例子:

不工作的 'é' 的 ASCII 码是 '101 204 129'。$e 是奇怪字符的函数ord($e);返回“101”,它是简单字母 e 的代码。

似乎我的“é”由三个字符组成,因为我必须制作一个
$e = substr($fileName,4,3);才能获得我的单个字符。

我希望能够在我的正则表达式中授权这些字符...如果您有任何线索,谢谢。

4

2 回答 2

2

使用扩展的 unicode 选项。

\X*.mp4

正则表达式演示

这是描述扩展 unicode 选项的PHP 手册。

\X 转义匹配 Unicode 扩展字素簇。扩展字素簇是一个或多个 Unicode 字符,它们组合成一个字形。实际上,这可以被认为是 Unicode 的等价物。因为它将匹配一个组合字符,而不管实际使用了多少个单独的字符来呈现它。

于 2014-11-19T16:33:51.237 回答
1

当您说“不起作用的 'é' 的 ASCII 代码是 '101 204 129'”时,您可能是指字节是十进制的那些数字。(它们不是 ASCII 代码:它们不能根据 ASCII 进行解释,此外,ASCII 以十进制 127 结尾。)在十六进制中,这意味着 65 CC 81。这是基本拉丁字母“的正确UTF-8 表示” e” U+0065 后跟 U+0301 组合重音。这又是“é”的正确分解表示。

因此,您首先要解决一个字符编码问题。您不应该处理字符的 UTF-8 字节,而是字符本身。您可能需要修改读取数据的例程,或者可能需要修复数据本身(如果已被修改)。

如果您正确读取了 UTF-8 数据,则组合的重音仍然是匹配的问题,因为它不是字母。您可能需要将数据转换为规范化表格 C,这会将两个字符的组合转换为字母“é”。

于 2014-11-19T16:51:40.543 回答