将值保存在平面数组中,在其中找到所需的子字符串(区分大小写)

问题描述 投票:0回答:5

我有这个数组:

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 个项目的数组,但我得到一个空数组。

php arrays substring filtering case-sensitive
5个回答
1
投票

你的正则表达式是错误的。

preg_match("/^my_custom_links$/"

将仅匹配

my_custom_links
的字符串。将其更改为

preg_match("/my_custom_links/"

1
投票

试试这个:

$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>";

1
投票

您的正则表达式不正确,因为它仅检查

^(starts)
$(ends)
my_custom_links

的字符串
^my_custom_links$

应该很简单

\bmy_custom_links

1
投票

你的代码没问题,唯一的问题是你的正则表达式。 它不起作用的原因是因为你在开头有这个

^
,这意味着在它的开头匹配指定的值,然后你有
$
,这意味着在字符串的末尾匹配该字符串指定值。

用这个代替

preg_match("/my_custom_links/" .. rest of the code

0
投票

因为您正在按文字/非动态模式进行过滤,所以没有真正的理由使用正则表达式。将

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()
,它使用正则表达式过滤值。如果您的逻辑需要不区分大小写、字符串锚点的开始/结束、字边界、多字节支持或其他动态要求,那么正则表达式将是合适的。

© www.soinside.com 2019 - 2024. All rights reserved.