我正在尝试从文本中获取所有出现的代码段和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"
}
}
我在做什么错了?
答案 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);
(?1)
在整个正则表达式中重复使用,以避免重复[^]]*
代替效率不高的.*?
来捕获值。