2013-04-26 28 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

相關問題