簡體   English   中英

以正則表達式獲取所有匹配項

[英]Get all matches in a regular expression

我有這個網址:

uploads/offers/picture/_YToxOntzOjc6Im9wdGlvbnMiO3M6MTY6Inpvb21Dcm9wLDI4MS_/_wyMDAiO30=_/518edc82d94b0-201341717250_descuen_a06d000000fkvwpiak_1_1.jpg 

而且我需要獲取所有/_(.*)_/部分,但是我的preg_match_all表達式似乎/_(.*)_/不好:

preg_match_all('#/_([^_/]+)_/#', $url, $params);

返回

Array
(
    [0] => Array
        (
            [0] => /_YToxOntzOjc6Im9wdGlvbnMiO3M6MTY6Inpvb21Dcm9wLDI4MS_/
        )
    [1] => Array
        (
            [0] => YToxOntzOjc6Im9wdGlvbnMiO3M6MTY6Inpvb21Dcm9wLDI4MS
        )
)

我需要

Array
(
    [0] => Array
        (
            [0] => /_YToxOntzOjc6Im9wdGlvbnMiO3M6MTY6Inpvb21Dcm9wLDI4MS_/
            [1] => /_wyMDAiO30=_/
        )
    [1] => Array
        (
            [0] => YToxOntzOjc6Im9wdGlvbnMiO3M6MTY6Inpvb21Dcm9wLDI4MS
            [1] => wyMDAiO30=
        )
)

表達式中常見的字符串部分有問題嗎?

正則表達式中的最終/最終消耗了它。 解決此問題的一種簡單方法是使用前瞻。

preg_match_all('#/_([^_/]+)_(?=/)#', $url, $params);

之間的/不匹配兩次,但是,您可以使用先行/后置斷言:

preg_match_all('#(?<=/_)[^_/]+(?=_/)#', $url,$params);

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(50) "YToxOntzOjc6Im9wdGlvbnMiO3M6MTY6Inpvb21Dcm9wLDI4MS"
    [1]=>
    string(10) "wyMDAiO30="
  }
}

當前解決方案的一個問題是,正如Explosion Pill的答案所說,它與表達式末尾的/匹配。 使用正向前瞻將解決該問題。

另一個可能的問題是,如果輸入中包含下划線作為您要捕獲的匹配項的一部分,則[^_/]部分可能最終會破壞正則表達式。

要立即解決兩個問題:

~/_(.+?)_(?=/)~

在我看來,這似乎更接近您的需求:“每當看到序列/_開始捕獲所有輸入,直到遇到序列_/為止”。 輸入中的下划線不會破壞這一點。

您的表達式拾取了兩個_ ,因此跳過了wyMDAiO30=部分。

我建議您使用explode("_", $url) (或preg_split(...)如果以上僅是示例,並且您需要正則表達式來識別分割的字符/子字符串)。

如果您確實堅持使用preg_match_all ,請查閱文檔。 有一種方式可以說“匹配它,但不要將它包括在字符串中”。 我認為它就像#_([^_/]+)(?=_)#

最好的解決方案可能是先分割字符串,然后檢查下划線:

<?php

$data = explode('/', $url);

foreach($data as $val) {
    if(substr($val, 0, 1) === '_' && substr($val, -1) === '_') {
        // ok
    }
}

暫無
暫無

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

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