我有这个数组:
array
0 => string 'http://example.com/site.xml'
1 => string 'http://example.com/my_custom_links_part1.xml'
2 => string 'http://example.com/my_custom_links_part2.xml'
3 => string 'http://example.com/my_custom_links_part3.xml'
4 => string 'http://example.com/my_some_other_custom_links_part1.xml'
此代码用于获取名称中包含“my_custom_links”的链接(但不包含“my_come_other_custom_links”)
$matches = array_filter($urls, function($var) { return preg_match("/^my_custom_links$/", $var); });
echo "<pre>";
print_r($urls); // will output all links
echo "</pre>";
echo "<pre>";
print_r($matches); // will output an empty array
echo "</pre>";
我应该得到一个包含 3 个项目的数组,但我得到一个空数组。
你的正则表达式是错误的。
preg_match("/^my_custom_links$/"
将仅匹配
my_custom_links
的字符串。将其更改为
preg_match("/my_custom_links/"
试试这个:
$urls = array (
0 => 'http://example.com/site.xml' ,
1 => 'http://example.com/my_custom_links_part1.xml' ,
2 => 'http://example.com/my_custom_links_part2.xml' ,
3 => 'http://example.com/my_custom_links_part3.xml',
4 => 'http://example.com/my_some_other_custom_links_part1.xml');
$matches = array_filter($urls, function($var) { return preg_match("/example.com/", $var); });
echo "<pre>";
print_r($urls); // will output all links
echo "</pre>";
echo "<pre>";
print_r($matches); // will output an empty array
echo "</pre>";
您的正则表达式不正确,因为它仅检查
^(starts)
和 $(ends)
与 my_custom_links
的字符串
^my_custom_links$
应该很简单
\bmy_custom_links
你的代码没问题,唯一的问题是你的正则表达式。 它不起作用的原因是因为你在开头有这个
^
,这意味着在它的开头匹配指定的值,然后你有 $
,这意味着在字符串的末尾匹配该字符串指定值。
用这个代替
preg_match("/my_custom_links/" .. rest of the code
因为您正在按文字/非动态模式进行过滤,所以没有真正的理由使用正则表达式。将
array_filter()
与 str_contains()
一起使用可保留包含所需子字符串的所有值。 (演示)
$needle = 'my_custom_links';
var_export(
array_filter(
$array,
fn($haystack) => str_contains($haystack, $needle)
)
);
输出:
array (
1 => 'http://example.com/my_custom_links_part1.xml',
2 => 'http://example.com/my_custom_links_part2.xml',
3 => 'http://example.com/my_custom_links_part3.xml',
)
事实是,将
array_filter()
与 preg_match()
一起使用实际上是一种反模式——这应该始终替换为 preg_grep()
,它使用正则表达式过滤值。如果您的逻辑需要不区分大小写、字符串锚点的开始/结束、字边界、多字节支持或其他动态要求,那么正则表达式将是合适的。