使用部分匹配字符串过滤数组列表

时间:2017-09-08 16:15:29

标签: php arrays

我有一个包含网址列表[ http://www.example.com/orange-pen, http://www.example.com/orange-pen-2, http://www.example.com/orange-pen-3, http://www.example.com/black-pen-1, http://www.example.com/black-pen-2]

的数组

我想过滤数组,因此它只显示包含" orange-pen" (即部分匹配)所以输出将是:

http://www.example.com/orange-pen
http://www.example.com/orange-pen-2
http://www.example.com/orange-pen-3

这是我到目前为止所做的,但它似乎并不起作用。如果这些也是一种更好,更有效的方式来实现它,那就太棒了。

$urls= array('http://www.example.com/orange-pen', 'http://www.example.com/orange-pen-2', 'http://www.example.com/orange-pen-3', 'http://www.example.com/black-pen-1', 'http://www.example.com/black-pen-2');

$string = 'orange-pen';
$url_string = end(explode(' ', $string1));

if (in_array($url_string,$urls)){
    echo "Match found"; 
    return true;
} else {
    echo "Match not found";
    return false;
}

4 个答案:

答案 0 :(得分:7)

试试这个单线眼镜。我们在这里使用preg_greppreg_quotepreg_grep将根据正则表达式匹配数组。 preg_quote引用正则表达式字符

Try this code snippet here

$result=  preg_grep("/".preg_quote("orange-pen")."/", $urls);
print_r($result);

<强>输出:

Array
(
    [0] => http://www.example.com/orange-pen
    [1] => http://www.example.com/orange-pen-2
    [2] => http://www.example.com/orange-pen-3
)

答案 1 :(得分:3)

除了在循环中使用strpos或stripos之外,您还可以这样做:

<?php

$urls = array(
      'http://www.example.com/orange-pen',
      'http://www.example.com/orange-pen-1',
      'http://www.example.com/black-pen',
      'http://www.example.com/orange-pen-2'
);

$string = 'orange-pen';

echo '<pre>';
print_r( array_filter( $urls, function( $url ) use ( $string ) {
    return ( stripos( $url, $string ) !== FALSE );
}) );
echo '</pre>';

答案 2 :(得分:1)

您可以循环播放数组项并使用strpos轻松确定字符串是否在网址中:http://php.net/strpos

示例:

$urls = array(
    'http://www.example.com/orange-pen', 
    'http://www.example.com/orange-pen-2', 
    'http://www.example.com/orange-pen-3', 
    'http://www.example.com/black-pen-1', 
    'http://www.example.com/black-pen-2'
);

$match_string = 'orange-pen';

$matching_array = array();

foreach ($urls as $url) {
    if (strpos($url, $match_string) !== FALSE) {
        $matching_array[] = $url;
    }
}

print_r($matching_array);

https://eval.in/858221

输出:

Array
(
    [0] => http://www.example.com/orange-pen
    [1] => http://www.example.com/orange-pen-2
    [2] => http://www.example.com/orange-pen-3
)

答案 3 :(得分:1)

以下是使用正则表达式过滤数组的简要示例:

<?php

$urls = [
    'http://www.example.com/orange-pen',
    'http://www.example.com/orange-pen-2',
    'http://www.example.com/orange-pen-3',
    'http://www.example.com/black-pen-1',
    'http://www.example.com/black-pen-2'
];

function filter($array, $needle) {
    return array_filter($array, function($subject) use ($needle) {
        return preg_match('#' . preg_quote($needle) . '#ui', $subject);
    });
}

var_dump(filter($urls, 'orange-pen'));

```

使用正则表达式,您可以设置更复杂的过滤方案。您也可以轻松地使用strpos函数(应该执行得更快)来检测字符串是否只存在于URL中的任何位置,如:

function filter($array, $needle) {
    return array_filter($array, function($subject) use ($needle) {
        return false !== strpos($subject, $needle);
    });
}

考虑一下我使用更新的语法来定义数组:[],PHP 5.4+中提供。另外,我在if比较的左侧放置常量表达式或函数调用,以避免错误地赋值(如果你愿意,可以翻转它们)。