【问题标题】:Pattern for preg_matchpreg_match 的模式
【发布时间】:2013-07-16 08:12:15
【问题描述】:

我有一个包含以下模式“[link:activate/$id/$test_code]”的字符串,当模式[link..... ] 发生。

我还尝试使用分组来获取内部项目,但只能激活并且 $test_code 无法获取 $id。请帮我获取数组中的所有参数和动作名称。

下面是我的代码和输出

代码

function match_test()
{
    $string  =  "Sample string contains [link:activate/\$id/\$test_code] again [link:anotheraction/\$key/\$second_param]]] also how the other ationc like [link:action] works";
    $pattern = '/\[link:([a-z\_]+)(\/\$[a-z\_]+)+\]/i';
    preg_match_all($pattern,$string,$matches);
    print_r($matches);
}

输出

    Array
    (
        [0] => Array
            (
                [0] => [link:activate/$id/$test_code]
                [1] => [link:anotheraction/$key/$second_param]
            )

        [1] => Array
            (
                [0] => activate
                [1] => anotheraction
            )

        [2] => Array
            (
                [0] => /$test_code
                [1] => /$second_param
            )

    )

【问题讨论】:

    标签: php preg-match-all


    【解决方案1】:

    试试这个:

    $subject = <<<'LOD'
    Sample string contains [link:activate/$id/$test_code] again [link:anotheraction/$key/$second_param]]] also how the other ationc like [link:action] works
    LOD;
    $pattern = '~\[link:([a-z_]+)((?:/\$[a-z_]+)*)]~i';
    preg_match_all($pattern, $subject, $matches);
    print_r($matches);
    

    如果您需要将\$id\$test_code 分开,您可以改用它:

    $pattern = '~\[link:([a-z_]+)(/\$[a-z_]+)?(/\$[a-z_]+)?]~i';
    

    【讨论】:

    • 它确实在一个元素中提供了所有变量。 [0] => 数组( [0] => [link:activate/$id/$test_code] [1] => [link:anotheraction/$key/$second_param] [2] => [link:action] ) [1] => 数组([0] => 激活 [1] => anotheraction [2] => 动作)[2] => 数组([0] => /$id/$test_code [1] => / $key/$second_param [2] => )
    • @Nish:您需要将/$id/$test_code 分隔在$id$test_code 中?
    • 是的,可以用一个正则表达式来做吗?没有在第二个中这样做?
    • @Nish:我不明白你的问题,第二种模式就是这样!使用它而不是第一个。
    • 谢谢@Casimir et Hippolyte
    【解决方案2】:

    这是你要找的吗?

    /\[link:([\w\d]+)\/(\$[\w\d]+)\/(\$[\w\d]+)\]/

    编辑:

    你的表达的问题也是这部分: (\/\$[a-z\_]+)+

    虽然你已经重复了组,匹配只会返回一个,因为它仍然只是一个组声明。正则表达式不会为您发明匹配的组号(反正我从未见过)。

    【讨论】:

    • 我仍然没有在匹配的值中得到 $id 。只获取 $test_code
    • 我刚刚在gskinner.com/RegExr 使用该表达式(不包含斜杠)、两个字符串进行了测试,并使用replace 工具将模式替换为$1、$2 和$3 ,工作正常。
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多