【问题标题】:Search for partial string in PHP array? Search value contains hashtag在 PHP 数组中搜索部分字符串?搜索值包含主题标签
【发布时间】:2015-10-14 15:45:45
【问题描述】:

例子:

$array = array('alpha beta','beta gamma','delta phi', '#alpha phi', 'beta phi');
$searchword = 'alpha';
$results = array_filter($array, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); });
print_r($results);

Array ( [0] => alpha beta [3] => #alpha phi )

我只想找到包含#alpha 的元素,而不是alpha

我想要的结果是Array ( [3] => #alpha phi )

但是,这不起作用:

$array = array('alpha beta','beta gamma','delta phi', '#alpha phi', 'beta phi');
$searchword = '#alpha';
$results = array_filter($array, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); });
print_r($results);

Array ( )

我也尝试过$searchword = preg_quote('#alpha');,但这也不起作用。我对正则表达式不够熟悉,无法弄清楚这一点——一定有一些我错过的正则表达式规则?

注意:我不想在数组中找到所有主题标签关键字。我想搜索特定的主题标签关键字。

学分:我使用了这里的答案之一: Search for PHP array element containing string

【问题讨论】:

    标签: php arrays regex


    【解决方案1】:

    去掉开头的\b

    preg_match("/$searchword\b/i", $var);
    

    使用\B

    preg_match("/\B$searchword\b/i", $var);
    

    为什么?

    这都是关于单词边界\b 在单词 char 和非单词 char 之间的匹配,反之亦然。由于第一个字符是#,它是一个非单词字符,并且在该字符之前存在行边界的开始。 \B 适合这个,它匹配两个非单词字符或两个单词字符。这里是行的开头,#,所以必须存在\B,而不是\b

    【讨论】:

    • $var 是一个数组 - 只是说
    • 效果很好,感谢您对正则表达式规则的解释,这真的很有帮助!
    • @Feanne - 你知道这将匹配 *alpha+alpha%alpha 以及 #alpha - 只是想我会提到这一点。奇怪的是,只有我的答案与 #alpha 完全匹配,没有其他起始词。
    • @ArtisiticPhoenix 他的搜索词是#alpha,那么它将如何匹配*alpha
    • 对不起,我弄糊涂了 \B 没看到用得太多,+ 这里是 330am,我的错
    【解决方案2】:

    或者你也可以用strpos代替preg_match作为

    $searchword = '#alpha';
    $results = array_filter($array, function($var) use ($searchword) { return (strpos($var,$searchword)>-1); });
    

    【讨论】:

    • 这将匹配 beta #alpha 以及 b#alpha 等。
    • 是的,可能是这样
    【解决方案3】:

    删除第一个 \b word boundary 并使用 $searchword = '#alpha';
    要搜索数组并获取与模式匹配的条目,请使用 preg_grep function

    print_r(preg_grep("/".preg_quote($searchword, "/")."\b/i", $array));
    

    数组 ( [3] => #alpha phi )

    Test at eval.in

    【讨论】:

    • preg_grep点赞。完美使用此功能。
    • 再次缺少^ 锚意味着这也将匹配beta #alpha 以及b#alpha 等。
    • @ArtisiticPhoenix 问题是:...搜索值包含标签
    【解决方案4】:

    更改您的代码

     $searchword = 'alpha';
    

    $searchword = '^#alpha';
    

    ^ # 标签开头,

     preg_match('/^#alpha/', '#alphasomething');
    

    将匹配#alpha

    https://regex101.com/r/rU1eA9/1

    不匹配 alpha

    https://regex101.com/r/rU1eA9/2

    因为这是开放的相互渗透

    我只想找到包含#alpha 的元素

    某些答案可能与“包含”#alpha 的各种内容相匹配,例如b#alphagama 或在某些情况下gamma #alpha 等。

    虽然我会在我的 RegX 表示中提到领先的 ^ 胡萝卜。因此,为了让我的答案与字符串匹配,字符串必须以 # 主题标签开头,后跟 alpha 字面意思。

    因此,如果您只是想要“包含”#alpha,例如gama#alpha,我的回答可能不是最好的。但是如果你想以#alpha开头,我会推荐使用它。

    我觉得确保突出显示这些边缘情况以及前导 ^ 在我的意思中的含义很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2012-09-01
      相关资源
      最近更新 更多