Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查字符串是否只包含指定的字符集?_Php_String_Preg Match_Ereg - Fatal编程技术网

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

Php 如何检查字符串是否只包含指定的字符集?,php,string,preg-match,ereg,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

我正在处理字符串,我想知道哪种方法最适合检查字符串是否只包含指定的字符集:

@  ∆  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  à 
@∆  SP 0?P?P
£  _  !  一问一答
$Φ“2 B R
日元Γ3分
è∧4dt
约为5欧元
ù∏和6 F V
ìψ'7gw
ò∑(8hx)
Θ)9我是
LFΞ*:J Z
Ø1)+KÄKä
øÆ,NÜNü
åê/?O§Oá
我试着让eregi和regexp完成,但没有成功。 另一种方法是将每个字符转换为十进制,然后检查它是否小于<137,或者通过in_array()检查每个元素,我发现它很弱

谁有更好的解决办法


提前感谢。

这里有一个很好的资源,可以帮助您找到答案

要保持操作O(n),您可以计算每个测试字符的ascii值,并将其放入哈希表中,如下所示:

$testChars[$ascii]=true

然后只需循环遍历主题字符串的字符,并测试哈希表值项是否已设置且是否等于true。如果其中任何字符为false,则它包含测试集中未包含的字符


这比在数组中使用要好,因为测试$testChars[$ascii]==true是一个常量O(1)查找。

对于单字节字符集,可以使用字符串函数:

$charset = 'abc';
$test = 'abcd';
$ofCharset = strlen($test) === strspn($test, $charset); # FALSE

否则,您必须将字符串拆分为每个字符的数组项,然后与字符表进行比较,该字符表可以是键控数组,也可以包含作为键的字符集的字符。

如果您仅试图找出是否有其他字符,您可以将字符集替换为““然后拿到斯特伦。。。如果为0,则只有这些字符存在。。。如果大于0,则存在其他字符

会回来吗

only charset chars
但是

会回来吗

other chars

HTH

我知道您已经接受了另一个答案,但我想解释一下为什么您尝试使用regex时没有效果。希望它能帮助你

首先,我注意到你对这个问题的看法。请注意,PHP的
ereg\uu
函数已被弃用;您应该只使用
preg\uu
功能

现在,如果你想用正则表达式来处理这类事情,你通常会使用一个否定字符类来定义一个你想要允许的字符列表,然后再寻找其他的字符

字符类是用方括号括起来的字符列表。可以通过在字符类的开头添加克拉符号来否定字符类。因此,如果您想要一个只包含“a”、“B”或“C”的字符串,并且希望得到关于包含其他内容的字符串的警告,那么您可以使用如下内容:

$result = preg_match("/[^ABC]/",$mystring);
$result = preg_match("/[^èΛ¤4DTdt]/u",$mystring);
您的示例基本上是相同的(但显然有更多的字符需要测试),除了两点:首先,列表中的字符是Regex中的保留字符,其次,您使用的是非Ascii字符

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

第二点解释了为什么不能使用
ereg
,因为
ereg
函数不支持unicode。改用
preg
函数,你会更幸运

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

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

$result = preg_match("/[^ABC]/",$mystring);
$result = preg_match("/[^èΛ¤4DTdt]/u",$mystring);
看起来您的字符列表中包含了新行,因此您可能还希望在
u
旁边添加多行修饰符
m

对于无法写入的字符(或者任何字符,如果更容易的话),可以为其unicode字符代码添加转义序列。使用
\uFFFF
,其中
FFFF
是要匹配的字符的十六进制unicode引用——例如
\u00E0
匹配
的字符

我希望这能让您更好地了解正则表达式。我应该补充一点,我并不是说正则表达式一定是这个问题的最佳解决方案,也不一定是唯一的解决方案。我已经尝试通过使用否定字符类(这意味着一旦找到不匹配的字符,它就会失败,并且应该防止过度回溯,这种回溯有时会导致正则表达式非常慢),使它的性能达到最佳状态,因此它的性能应该是合理的,但我还没有将其与其他解决方案进行对比测试


我希望这能有所帮助。

我知道这是一个老问题,但没有人提到。我从来没有尝试过使用奇怪的字符,但除了这可能是一个问题之外,为什么这不起作用?

不幸的是,它没有帮助我找到解决方案,因为文本最多约400个字符->这种方式似乎是最好的庆幸你有一个适合你的答案。我已经添加了我自己的答案,试图解释为什么您的正则表达式尝试失败,因为没有其他答案真正涵盖它。希望你觉得它有用。谢谢你复杂的答案。这真的很有帮助!