簡體   English   中英

這個正則表達式有什么問題?

[英]What's wrong with this regex expression?

我想preg_match以下代碼:

{{{/foo:bar/a/0/b}}}

這是我的正則表達式(不起作用,我不明白為什么):

|{{{\/([[:alpha:]][[:alnum:]\_]*\:[[:alpha:]][[:alnum:]\_]*)(?:\/([[:alnum:]\_]*))+}}}|Uism

預期結果:

Array (
[0] => Array
    (
        [0] => {{{/foo:bar/a/0/b}}}
    )

[1] => Array
    (
        [0] => foo:bar
    )

[2] => Array
    (
        [0] => a
    )

[3] => Array
    (
        [0] => 0
    )

[4] => Array
    (
        [0] => b
    )
)

我得到的結果是:

Array (
[0] => Array
    (
        [0] => {{{/foo:bar/a/0/b}}}
    )

[1] => Array
    (
        [0] => foo:bar
    )

[2] => Array
    (
        [0] => b
    )
)

我只得到最后一個元素。 那怎么了

您要重復第二個捕獲組:

(?:
 \/
 (
  [[:alnum:]\_]*
 )
)+

在外部非捕獲組的每次重復中,內部捕獲組的內容都會被覆蓋,這就是為什么僅保留最后一個匹配項的原因。 這是所有正則表達式引擎的標准行為。

(?=(^.*$)|(?:\/(.*?)(?:\/|})))

試試看。看演示。

http://regex101.com/r/lS5tT3/3

同一捕獲組的每個后續匹配項將覆蓋前一個匹配組; 這就是為什么您只得到b

在這種情況下,我建議首先匹配整個塊,然后使用更簡單的explode()來挖掘內部數據。 使用以下表達式:

|{{{\/([[:alpha:]][[:alnum:]\_]*\:[[:alpha:]][[:alnum:]\_]*(?:\/[[:alnum:]\_]*)+)}}}|U

然后,使用生成的$matches數組( preg_match()第三個參數):

$data = explode('/', $matches[1]);

您的模式對於某些應該非常簡單的事情來說完全是矯kill過正:

$rex = "@[{]{3}/(\w+:\w+)/(\w)/(\d)/(\w)[}]{3}@";
$str = "{{{/foo:bar/a/0/b}}}";

preg_match($rex, $str, $res);

結果:

Array
(
    [0] => {{{/foo:bar/a/0/b}}}
    [1] => foo:bar
    [2] => a
    [3] => 0
    [4] => b
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM