Extracting matches from php regex

前端 未结 5 2078
深忆病人
深忆病人 2020-12-03 14:33

In perl regex we can extract the matched variables, ex below.

   # extract hours, minutes, seconds
   $time =~ /(\\d\\d):(\\d\\d):(\\d\\d)/; # match hh:mm         


        
相关标签:
5条回答
  • 2020-12-03 14:40

    The simpler solution

    1. go to regex101.com
    2. Use the great documentation for creating and testing your regex (make sure you select PHP).
    3. In the TOOLS section click on code generation

    4. This is an example of what I got.

    $re = '/\#.*@hello\((?<operator>\w+),?(?<args>.*)\).*/m';
    $str = ' Testing string
    # @hello(group_fields)
    # @hello(operator, arguments, more arguments)';
    
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    
    // Print the entire match result
    var_dump($matches);
    
    0 讨论(0)
  • 2020-12-03 14:44

    You can just modify your current regexp to capture everything after the colon up to the first space:

    $subject = "E:contact@customer.com I:100955";
    $pattern = "/^E:([^ ]+)/";
    if (preg_match($pattern, $subject, $m)) {
        echo "Yes, A Match";
    }
    $email = $m[1];
    

    In case you're not familiar with regexp, [^ ]+ means "any character but a space" and it doesn't require a space to be present to work. If for any reason the input changes to "E:email@host.tld" without the " I:12345" bit, it will still work.

    0 讨论(0)
  • 2020-12-03 14:49

    Use the matchs parameter of the preg_match function as follows:

    matches:
    If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.

    0 讨论(0)
  • 2020-12-03 14:58

    Try using the named subpattern syntax of preg_match:

    <?php
    
    $str = 'foobar: 2008';
    
    // Works in PHP 5.2.2 and later.
    preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);
    
    // Before PHP 5.2.2, use this:
    // preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
    
    print_r($matches);
    
    ?>
    

    Output:

     Array (
         [0] => foobar: 2008
         [name] => foobar
         [1] => foobar
         [digit] => 2008
         [2] => 2008 )
    
    0 讨论(0)
  • 2020-12-03 15:04

    Check the php manual

    int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )

    If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches1 will have the text that matched the first captured parenthesized subpattern, and so on.

    $subject = "E:contact@customer.com I:100955";
    $pattern = "/^E:(?<contact>\w+) I:(?<id>\d+)$/";
    if (preg_match($pattern, $subject,$matches)) {
        print_r($matches);
    }
    
    0 讨论(0)
提交回复
热议问题