如何在 PHP 中搜索多个字符串的文本

How to search text for multiple strings in PHP

我有一个文本字符串如下:

$input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae magna vel neque tincidunt.";
add_filter('hello_text', 'sample'); 
add_filter('goodbye_text', 'sample');

我需要在字符串中搜索 "add_filter('***'" 并获取 *** 文本。如果字符串包含多个不同的***字符串,我也需要获取它们并将它们保存到一个数组中。

所以上面的 $input 字符串会生成:array('hello_text','goodbye_text')

我想我可以使用 stripos (),但我不确定如何找到这种文本模式,因为每次 *** 文本都会不同。

<?php

function find_filters($string)
{
    if (!preg_match_all("|add_filter\('([a-z0-9_]+)'|ui", $string, $matches)) {
        return [];
    }

    return array_unique($matches[1]);
}

$input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit add_filter('hellotext', 'sample'). Sed vitae magna add_filter('goodbye_text', 'sample') vel neque tincidunt.";

$result = find_filters($input);
var_dump($result);

这是基于 dekameron 的回答,但使正则表达式更通用。

<?php

$input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit add_filter('hello_text', 'sample'). Sed vitae magna add_filter('goodbye_text', 'sample') vel neque tincidunt.";

preg_match_all( "/add_filter\s*?\(\s*?'(.+?)'/ui", $input, $matches );

print_r($matches[1]);

挂钩名称不仅限于字母、数字、下划线等基本字符(高级自定义字段是一个在挂钩名称中使用正斜杠的插件)。此正则表达式将处理通用挂钩名称(但是,它不会处理转义的单引号)。此外,这将处理“add_function”、左括号和钩子参数之间的间距发生变化的情况。