PHP筛选器部分匹配的数组元素

时间:2018-12-04 18:43:46

标签: php preg-match array-filter

我有一个数组,其中包含多个具有相似名称的元素(URL)。

我正在使用array_filter来过滤包含特定字符串的元素。

$urls = $images;
$string = 'books-for-kids';

$images= array_filter( $urls, function( $url ) use ( $string ) {
    return ( stripos( $url, $string ) !== FALSE );
});

下面是输出:

    array(126) { 
        [51]=>  string(103) “http://www.example.com/books-for-kids-to-print-90” 
        [52]=>  string(107) “http://www.example.com/free-books-for-kids-to-print-1” 
   }

由于我要过滤的字符串在两个URL中,因此它们都匹配。 但是,这不是我想要的输出。我只是想匹配第一个URL。

我不太确定该怎么做,但正在考虑使用正则表达式以这种方式匹配“ / string- [0-9]”(反斜杠字符串破折号),这样它只会匹配第一个URL。

>

1 个答案:

答案 0 :(得分:1)

你猜对了。您可以使用正则表达式:

$images = array_filter($urls, function($url) use ($string) {
    return preg_match("~^.*/$string(-\d+)?/?$~", $url);
});

正则表达式查找包含$string以及可选的前导-[0-9]模式的最后一条路径。因此,像http://localhost/path/sub-path/YOUR-STRING-01/这样的URL将通过。

注意:如果$string来自不受信任的来源,请对其进行preg_quote()