如何检查字符串是否只包含指定的字符集?

are*_*icz 3 php string preg-match ereg

我正在研究字符串,我想知道哪种方法最好检查字符串是否只包含指定的字符集:

@  ?  SP  0  ¡  P  ¿  p 
£  _  !  1  A  Q  a  q 
$  ?  "  2  B  R  b  r 
¥  ?  #  3  C  S  c  s 
è  ?  ¤  4  D  T  d  t 
é  O  %  5  E  U  e  u 
ù  ?  &  6  F  V  f  v 
ì  ?  '  7  G  W  g  w 
ò  ?  (  8  H  X  h  x 
Ç  ?  )  9  I  Y  i  y 
LF  ?  *  :  J  Z  j  z 
Ø  1)  +  ;  K  Ä  k  ä 
ø  Æ  ,  <  L  Ö  l  ö 
CR  æ  q  =  M  Ñ  m  ñ 
Å  ß  .  >  N  Ü  n  ü 
å  É  /  ?  O  §  o  à 
Run Code Online (Sandbox Code Playgroud)

我试图通过eregi和regexp完成它,但没有成功.另一种方法是将每个char转换为十进制并检查它是否小于<137,或者通过in_array()检查每个元素 - 我觉得它很弱.

谁有更好的解决方案?

提前致谢.

Spu*_*ley 9

我看到你已经接受了另一个答案,但我想解释为什么你的正则表达式的尝试不起作用.希望它能帮到你.

首先,我在你的标签中注意到了这个问题的.请注意,PHP的ereg_功能已被弃用; 你应该只使用这些preg_功能.

现在,如果要将regex用于此类事情,通常会使用否定字符类来定义要允许的字符列表,然后查找其他任何内容.

字符类是用方括号括起来的字符列表.您可以通过在其开头添加克拉符号来否定字符类.因此,如果您想要一个仅包含"A","B"或"C"的字符串,并且您希望收到包含其他任何内容的字符串的警告,您可以使用以下内容:

$result = preg_match("/[^ABC]/",$mystring);
Run Code Online (Sandbox Code Playgroud)

您的示例基本相同(但显然需要更多字符进行测试),除了两点:首先,列表中的字符是Regex中的保留字符,其次,您使用的是非Ascii字符.

可以通过使用前导反斜杠转义它们来处理正则表达式保留字符.您只需要知道保留了哪些字符.看着你的列表中,我看到?,/,.+.

第二点解释了为什么你不能使用它ereg,因为这些ereg函数不支持unicode.切换到使用这些preg功能,你会有更多的运气.

您仍然需要为正则表达式引擎指定您正在寻找unicode字符.这是通过将u修饰符添加到正则表达式字符串的末尾来完成的.

因此,查询的缩短版本可能如下所示:

$result = preg_match("/[^è?¤4DTdt]/u",$mystring);
Run Code Online (Sandbox Code Playgroud)

它看起来像你,包括你的人物的名单新的生产线,所以您可能还需要添加多行修改m旁边那个u.

对于无法写入的字符(或者对于任何字符,如果更容易),您可以为其unicode字符代码添加转义序列.使用\uFFFF这里FFFF是要匹配的字符十六进制的Unicode基准-例如\u00E0相匹配à.

我希望这能让您更好地了解正则表达式.我应该补充一点,我并不是说正则表达式必然是这个问题的最佳解决方案,也不一定是唯一的解决方案.我试图通过使用否定的字符类来使它最佳地执行(这意味着它一旦找到不匹配的字符就会失败,并且应该防止过多的回溯,这可能导致正则表达式有时很慢),所以它应该是合理的性能,但我没有测试它与其他解决方案.

我希望有所帮助.