skip to Main Content

I am trying to make this work but I can’t:

$str = "<html>1</html><html>2</html><html>3</html>";
$matches = array(); 
preg_match_all("(?<=<html>)(.*?)(?=</html>)", $str, $matches);

foreach ($matches as $d)
{
   echo $d;
}

What I am doing wrong? The output must be:

123

2

Answers


  1. This should work for you:

    $str = "<html>1</html><html>2</html><html>3</html>";
    preg_match_all("~(?<=<html>).*?(?=</html>)~", $str, $matches);
    
    foreach ($matches[0] as $d) {
       echo $d;
    }
    

    Output:

    123
    

    Changes are:

    • Use missing regex delimiters ~ in preg_match_all function pattern
    • Remove capturing group since you are already using lookahead and lookbehind so entire match can be used in further processing
    • Using $matches[0] in foreach loop instead of $matches
    • There is no need to declare/initialize $matches before preg_match_all call
    Login or Signup to reply.
  2. You need to add delimiters (I’ve used !) and you can skip the lookaheads/lookbehinds. Just make a capture group around the numbers you want. Nothing else.
    Then look in the second matches element for the array with the individual values.

    Example:

    preg_match_all("!<html>(.*?)</html>!", $str, $matches);
    
    foreach ($matches[1] as $d)
    {
       echo $d;
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search