2013-04-26 52 views
0

有一个号码的category property codes(参见部分“Unicode字符属性”),可被用于Perl-compatible Regular Expression (PCRE)如何使用类别属性代码从RegEx模式中排除字符?

我所定义的正则表达式模式(named subpattern),即应与字母(\p{L}),数字(\p{N}) ,空格分隔符(\p{Zs}),也是标点符号(\p{P})。

(?<sport>[\p{L}\p{N}\p{Zs}\p{P}]*) 

由于我使用URL进行路由,因此应该排除斜线。我怎样才能做到这一点?


编辑:

有关上下文Addtitional信息:用于Zend框架2模块中的路由定义的图案。

/Catalog/config/module.config.php

<?php 
return array(
    ... 
    'router' => array(
     'routes' => array(
      ... 
      'sport' => array(
       'type' => 'MyNamespace\Mvc\Router\Http\UnicodeRegex', 
       'options' => array(
        'regex' => '/catalog/(?<city>[\p{L}\p{Zs}]*)/(?<sport>[\p{L}\p{N}\p{Zs}\p{P}]*)', 
        'defaults' => array(
         'controller' => 'Catalog\Controller\Catalog', 
         'action'  => 'list-courses', 
        ), 
        'spec' => '/catalog/%city%/%sport%', 
       ), 
       'may_terminate' => true, 
       'child_routes' => array(
        'courses' => array(
        'type' => 'segment', 
         'options' => array(
          'route' => '[/page/:page]', 
          'defaults' => array(
           'controller' => 'Catalog\Controller\Catalog', 
           'action'  => 'list-courses', 
          ), 
         ), 
         'may_terminate' => true, 
        ), 
       ) 
      ), 
     ), 
    ), 
    ... 
); 
+0

您能否添加一些您想要应用正则表达式的字符串示例以及您想要的结果? – Alexey 2013-04-26 15:15:36

+0

当然:“合气道”,“有氧运动,有氧运动”。 URI _can_在体育标题(例如'Aikido/page/2'或'Aerobic,Sportaerobic/page/2')之后继续,因此RegEx解析器应该通过斜线停止。 – automatix 2013-04-26 15:23:30

回答

3

您可以使用负面预读从字符集中排除某些字符。对于你的例子:

(?<sport>(?:(?!/)[\p{L}\p{N}\p{Zs}\p{P}])*) 

基本上,你会检查下一个字符不是/负前瞻(?!/),继续检查字符是否属于字符集[\p{L}\p{N}\p{Zs}\p{P}]之前。

PCRE没有设置相交或设置差异功能,所以这是解决方法。

+0

非常感谢您的解答和解释! – automatix 2013-04-26 15:54:12

0

由于您使用它的URL解析:

根据RFC 1738$-_.+!*'(),在URL¹允许未编码的,所以不是使用\pP(是的,而不是\p{P}),我建议你直接在你的正则表达式中使用这些字符。

编辑:但如果这不是一种选择,这应该是一个起点

(?:([\p{L}\p{N}\p{Zs}\p{P}]+?)(?=/|\?|#|$)) 

亲切的问候, 汤姆

¹:不完全正确,但/@#;?&=只是他们是否应该允许非编码有其特殊的含义。

+0

有一些后来的RFC允许国际化的国际网址域名,其中URL中允许使用Unicode字符。不知道OP是否需要处理它们。 – nhahtdh 2013-04-26 15:29:41

+0

谢谢你的回答!但是有没有办法让这种模式如此,只能排除斜线?就像'(? [\ p {L} \ p {N} \ p {Zs} \ p {P}^/] *)'。 – automatix 2013-04-26 15:30:01

相关问题