如何从空数组值中清除preg_match_all


How to clear preg_match_all from empty array values

我正在使用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的答案是最好的方法。