我正在使用preg_match_all为shortcode构建数组它工作正常,但也返回空值的数组请看这里
https://eval.in/141437
使用这个匹配开关,我确信是造成额外的空数组
#'[link(.*?)link'='"(.*?)'"(.*?)text'='"(.*?)'"']#e
我该如何清除这些。我尝试了array_filter,但它不起作用。
谢谢!
()
表示一个捕获组,即使它为空,也会在$matches
数组中表示。
要么去掉像(.*?)
那样返回空的组周围的()
,使其仅为.*?
(因为可能您不希望这些返回),要么告诉引擎不要用像(?:.*?)
那样的(?:
捕获它。
#'[link.*?link'='"(.*?)'".*?text'='"(.*?)'"']#e
或者,如果您确实希望在它们不为空时返回,则使用+
而不是*
:
#'[link(.+?)link'='"(.*?)'"(.+?)text'='"(.*?)'"']#e
如果像这样使用array_filter()函数,它应该可以工作:
$matches = array_filter($matches, function($item) { return trim($item[0]) && true; });
AbraCadaver的答案是最好的方法。