PHP 过滤部分匹配的数组元素

PHP Filter partially matched array elements

我有一个数组,其中包含多个具有相似名称的元素(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.

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

$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()