我有一个包含网址列表[ 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;
}
答案 0 :(得分:7)
试试这个单线眼镜。我们在这里使用preg_grep
和preg_quote
。 preg_grep
将根据正则表达式匹配数组。 preg_quote
将引用正则表达式字符
$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);
输出:
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比较的左侧放置常量表达式或函数调用,以避免错误地赋值(如果你愿意,可以翻转它们)。