正则表达式不适合俄语文本

时间:2011-09-07 09:55:44

标签: php regex

  

可能重复:
  regexp with russian lang

我有一个正则表达式,可以过滤掉文本中的某些链接,并根据链接的文件类型附加文件图标。像这样:

$text = preg_replace('((<a href="[\w\./:]+getfile.php\?id='.$file.'"([a-zA-Z0-9_\- ,\.:;"=]*)>)([a-zA-Z0-9_,\.:;&\-\(\)\<\>\'/ ]+)</a>)','\\1'.fileicon($name).'</a> \\1\\3</a> ('.($pagecount?$pagecount."&nbsp;".($pagecount>1?$pages:$page1).", ":"").readable_filesize($size,1).')',$text);

这很有效,直到我用一些俄语文本尝试这个。输入将类似于:

<a href="/site/getfile.php?id=33">Русский</a>

但它不会在链接之前显示链接和文件信息之前的图标,这让我怀疑正则表达式与俄语文本不一致。这可能是什么情况?

4 个答案:

答案 0 :(得分:2)

您的角色类只允许[a-zA-Z0-9_,\.:;&\-\(\)\<\>\'/ ]。那里没有russion字符。

您可以通过在课程中添加相关字符来解决此问题。如果你只需要支持俄语,\p{InCyrillic}应该这样做。如果您想要所有的unicode字母\p{Letter}

答案 1 :(得分:2)

使用Unicode字符串时,您应使用u修饰符:

preg_replace('/>([^<]+)</u', '', $string);

答案 2 :(得分:1)

您可以将正则表达式简化为

$re = "~
    (<a\s+href=\".+?getfile\.php\?id=$file\".*?>)
    (.+?)
    </a>
~xui";

这应该自动解决西里尔问题。

答案 3 :(得分:0)

西里尔字母unicode字符在\x0400-\x04FF范围内。在角色类中添加此范围。