如何使用preg_match_all从字符串中检索三个参数?

时间:2019-03-13 17:07:59

标签: php regex

我正在尝试从文本中获取所有出现的代码段和3个参数。 我使用正则表达式 preg_match_all PHP函数进行此操作。

如果我在文本中只出现了一个摘录,则效果很好。 如果有两个或两个以上,我会得到一个奇怪的结果。

我对正则表达式不是很熟练,因此我很难理解我所缺少的东西。

功能

var state = 0;
var backup = {};
backup.fontSize = document.getElementById("demo").style.fontsize;
backup.color = document.getElementById("demo").style.color;
backup.background = document.getElementById("demo").style.backgroundcolor;

文本1(在这种情况下,按方面显示)

function myFunction() {
  if (state == 0) {
    document.getElementById("demo").style.fontsize = "25px";
    document.getElementById("demo").style.color = "#3AF702";
    document.getElementById("demo").style.backgroundcolor = "red";
    state = 1;
  } else {
    document.getElementById("demo").style.fontsize = backup.fontSize;
    document.getElementById("demo").style.color = backup.color;
    document.getElementById("demo").style.backgroundcolor = backup.background;
    state = 0;
  }
}

返回:

public function getGallerySnippetOccurrences($text) {

    $ptn = '/{# +gallery +(src|width|height)=\[(.*)\] +(src|width|height)=\[(.*)\] +(src|width|height)=\[(.*)\] +#}/';

    if(preg_match_all($ptn,$text,$matches)){
        $turnedMatches = $this->turn_array($matches);
        return $turnedMatches;
    }
    else {
        return null;
    }
}

文本2(未预期的行为)

Lorem ipsum {# gallery src=[holiday_images/london] width=[400] height=[300] #} sid amet.

返回

array(1) {
  [0] =>
  array(7) {
    [0] =>
    string(66) "{# gallery src=[holiday_images/london] width=[400] height=[300] #}"
    [1] =>
    string(3) "src"
    [2] =>
    string(21) "holiday_images/london"
    [3] =>
    string(5) "width"
    [4] =>
    string(3) "400"
    [5] =>
    string(6) "height"
    [6] =>
    string(3) "300"
  }
}

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

在您的模式中,您使用的贪婪匹配使用(。),应将其替换为非贪婪模式(。?)。请在下面找到图案

$ptn = '/{# +gallery +(src|width|height)=\[(.*?)\] +(src|width|height)=\[(.*?)\] +(src|width|height)=\[(.*?)\] +#}/';

答案 1 :(得分:1)

正如我在下面的评论中所指出的那样,使量词变为非贪婪将使其起作用。但是,这仍然会使您的正则表达式重复且效率低下。

您可能会在两点上都考虑使用这种方法:

$re = '/{\#
\h+gallery
\h+(src|width|height)=\[([^]]*)]
\h+((?1))=\[([^]]*)]
\h+((?1))=\[([^]]*)]
\h*\#}/x';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches); 

RegEx Demo

  • 请注意,此正则表达式如何定义子模式并使用(?1)在整个正则表达式中重复使用,以避免重复
  • 还请注意,使用更高效的否定类[^]]*代替效率不高的.*?来捕获值。