php - 用于过滤具有破折号、空格、数字和某些单词的具有挑战性的字符串的正则表达式

标签 php regex preg-replace

对于我的搜索面板,我必须过滤如下所示的字符串:

'4dan-7kyu' or '4dan - 7kyu' or '10kyu' or '10 kyu' or '2dan' or '2 dan' or  '4-7'  or '4 - 7'  or  '10'  

只允许:

  1. 1-10 中的数字;
  2. 单词不区分大小写,包括:dankyuданкью
  3. 破折号(不超过一个且从不在字符串的开头,从不 -10kyu 或从不 -10);
  4. 空格(不超过一次,但绝不会出现在字符串的开头);

我在想这样的事情,但它对我来说从来没有完全奏效:

/([1-9]|10)\s-\s|dan|kyu|дан|кью/i

编写这种正则表达式的正确方法是什么?

编辑 1:

  1. 空格(不超过一次,但绝不在字符串的开头)
    无效示例:4dan___-___7kyu_4dan_-_7kyu
    有效示例:4dan-7kyu4dan - 7kyu4 dan - 7kyu4 dan - 7 kyu

编辑 2:

更多无效示例: 12dan-7kyu12dan-11kyu

最佳答案

我猜是:

/(^([1-9]|10)\s*$)
|
(^([1-9]|10)\s?-\s?([1-9]|10)\s*$)
|
(^([1-9]|10)\s?(dan|kyu|дан|кью)\s*$)
|
(^([1-9]|10)\s?(dan|kyu|дан|кью)\s?-\s?([1-9]|10)\s?(dan|kyu|дан|кью)\s*$)/ixu

这是 PHP 示例:

$rgData   = ['12', '20dan', ' 1kyu - 4kyu   ', '1kyu - 4kyu  ', 
             '1 kyu - 4 kyu', '1 kyu-4 kyu','4dan-7kyu', '4dan - 7kyu', 
             '10kyu', '10 kyu', '2dan', '2 dan', '4-7', '4 - 7', '10'];
$sPattern = '/(^([1-9]|10)\s*$)
             |
             (^([1-9]|10)\s?-\s?([1-9]|10)\s*$)
             |
             (^([1-9]|10)\s?(dan|kyu|дан|кью)\s*$)
             |
             (^([1-9]|10)\s?(dan|kyu|дан|кью)\s?-\s?([1-9]|10)\s?(dan|kyu|дан|кью)\s*$)/ixu';
var_dump(array_filter($rgData, function($sItem) use ($sPattern)
{
   return preg_match($sPattern, $sItem, $rgMatches);
}));//first 3 not matched

附言向武术同仁问好!

关于php - 用于过滤具有破折号、空格、数字和某些单词的具有挑战性的字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18482159/

相关文章:

php - 按时间戳对组内的行进行排序

regex - Perl regexp - 检索要列出的所有匹配项并将其从文本中删除

python - 负向先行匹配

php - 如何使用 preg_replace 删除字符串中出现的所有以下样式标签/模式?

php - 解析电子邮件或 html 模板的最佳方法是什么?

PHP动态图像

php - 如何在 Symfony2 中抛出 403 异常?

java - 正则表达式替换条件字符

php - 删除字符串之间的字符串并替换为文本加计数器

php - 如何更改plupload中文件的位置