[英]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:]\_]*
)
)+
在外部非捕獲組的每次重復中,內部捕獲組的內容都會被覆蓋,這就是為什么僅保留最后一個匹配項的原因。 這是所有正則表達式引擎的標准行為。
同一捕獲組的每個后續匹配項將覆蓋前一個匹配組; 這就是為什么您只得到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.