【问题标题】:PHP regex, extracting characters between specified charactersPHP正则表达式,提取指定字符之间的字符
【发布时间】:2012-05-31 23:32:57
【问题描述】:

我似乎无法弄清楚我是如何在字符之间提取字符的。

考虑这个字符串,

  $string = "sometext/#a=10/#b=25/moretext";

我想做的是提取“a”和“b”的值(10和25)

所以本质上我想要做的是找到“#a=”并在下面的 / 之前获取所有内容,然后对 b 执行相同的操作。谁能告诉我这是如何实现的?

此外,如果有人知道他们可以推荐的任何可靠的正则表达式教程,我将非常感激,我已经检查了 nettuts、w3schools 和 php.net,它们都有不错的,但任何其他推荐都会很棒。谢谢。

【问题讨论】:

    标签: php regex split extract


    【解决方案1】:

    这对我有用:

    <?php
    
    $string = "sometext/#a=10/#b=25/moretext/#varname=Hello World/evenmoretext/";
    
    $matchcount = preg_match_all('@#([^=]+)=([^/]*)/@', $string, $matches);
    
    for ($i = 0; $i < $matchcount; ++$i) {
        echo "{$matches[1][$i]} = {$matches[2][$i]}\n";
    }
    

    输出:

    a = 10
    b = 25
    varname = Hello World

    很久以前,我发现网站http://www.regular-expressions.info/ 很有帮助,而且它提供了很好的信息。您可能会发现用于测试正则表达式的 GUI 程序会很有帮助,因为它们可以在您键入表达式时实时显示匹配项。想到的一个例子是 Regex Buddy,但这需要花钱。这个online regex tester 看起来也很有希望。

    【讨论】:

    • 我需要按原样提取字符之间的所有内容,甚至可以是符号。这种方法还能用吗?
    • 是的,([^/]*) 表示要继续匹配任何 除了 / 的内容,因此它将匹配任何字符并继续运行,直到看到 /
    • 为了使其更健壮,我更改了正则表达式的第一部分以匹配直到 = 符号的任何字符,所以现在 = 之前的部分几乎可以是任何东西。跨度>
    • @Ian 这个答案实际上比我的要好,我唯一不同的是使用for 循环将结果解析为关联数组,但实际上这个表达式更好 - 如图所示说,更健壮。您可以轻松地将我的代码的最后一小部分放入其中,以从另一端获取相同的数据结构。
    • ...谢谢,我会重新选择此作为最佳答案并更改代码。
    【解决方案2】:
    $string = "sometext/#a=10/#b=25/moretext";
    $expr = '@#([a-z]+)=(.+?)/@';
    $count = preg_match_all($expr, $string, $matches);
    
    $result = array();
    for ($i = 0; $i < $count; $i++) {
        $result[$matches[1][$i]] = $matches[2][$i];
    }
    
    echo "<pre>";
    print_r($result);
    echo "</pre>";
    

    See it working

    如果你真的想掌握正则表达式的具体细节,我推荐的最佳资源是http://www.regular-expressions.info/

    【讨论】:

    • 谢谢,这就是我最终可能会使用的方法。我一定也会去看看那个网站。
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多