Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否有一种更直接的方法可以在忽略空格的情况下搜索字符串?_Php_Regex - Fatal编程技术网

Php 是否有一种更直接的方法可以在忽略空格的情况下搜索字符串?

Php 是否有一种更直接的方法可以在忽略空格的情况下搜索字符串?,php,regex,Php,Regex,我正在研究一个函数,该函数在字符串中搜索给定单词列表中的一个。正在搜索的字符串是由OCR软件生成的,它偶尔会在字母之间添加额外的空格(取决于字体),我需要忽略这些空格 我目前有一个函数如下所示: function searchSomeText($searchTerms, $stringToBeSearched) { $matches = array(); for($i=0; $i < count($searchTerms); ++ $i) { $se

我正在研究一个函数,该函数在字符串中搜索给定单词列表中的一个。正在搜索的字符串是由OCR软件生成的,它偶尔会在字母之间添加额外的空格(取决于字体),我需要忽略这些空格

我目前有一个函数如下所示:

function searchSomeText($searchTerms, $stringToBeSearched)
{
    $matches = array();
    for($i=0; $i < count($searchTerms); ++ $i)
    {
        $searchTerms[$i] = substr(chunk_split($searchTerms[$i],1,"\s*"), 0, -3);
    }
    $searchTermsString = implode("|", $searchTerms);

    if (preg_match("/\b($searchTermsString)\b/", $stringToBeSearched, $matches))
    {
        return $matches;
    }
    else { return false; }
}
函数searchSomeText($searchTerms,$stringToBeSearched)
{
$matches=array();
对于($i=0;$i
  • 除了在搜索词中的每个字符之间添加
    '\s*'
    之外,还有什么方法可以忽略空格吗
  • 如果没有,除了使用
    chunk\u split()
    将其添加到每个字符后,然后从末尾将其切掉之外,还有没有更有效的方法将
    '\s*'
    添加到搜索词中的每个字符后(但最后一个字符除外)
  • 编辑
    我不希望只从
    $stringtobearched
    中删除空格,因为在大多数情况下,如果空格正确,我不希望搜索词包含在另一个单词中(因此
    '\b'
    s)

    以下是我对您的任务的理解的推荐策略:

  • 不要变异草垛字符串。通常,要搜索的字符串比搜索中使用的针长得多。在可能的情况下,应避免这种可能的重型吊装
  • 您的搜索词似乎是动态的(可能来自用户输入),因此必须转义字符以防止正则表达式模式破坏。此过程使用
    preg_quote()
  • 在转义搜索词中的所有非空白字符之间插入
    \s*
    (忽略转义斜杠)
  • 然后将一个或多个空格的所有序列转换为搜索词中的
    \s+
  • 既然术语已经准备好了,就用管道把它们粘在一起。将管道表达式包装在括号中,然后将捕获组包装在wordboundary标记中(
    \b
  • 虽然您的问题中没有提到,但我建议使用不区分大小写的匹配。如果可能涉及多字节/unicode字符,请同时添加
    u
    模式修饰符
  • 推荐代码:()

    输出:(动态正则表达式模式和返回值)


    使用
    str\u replace(“”,,$string)
    修改
    $stringtobearched
    可能会更容易、更有效,即使这不会“直接”回答您的问题。@Sam谢谢,在我的特殊情况下,这对我不起作用。我的实际代码比我的问题要复杂一点。我原以为简单一点的版本会让问题更清楚,但我现在要编辑它。嗯,一开始我什么都没想到。你的方法应该是可行的,但我同意这不是一个简单的方法,而且根据
    $searchTerms
    $stringToBeSearched
    的长度可能会变得非常低效。如果这个问题包含@伊萨姆
    function searchSomeText(array $searchTerms, string $stringToBeSearched): bool
    {
        foreach ($searchTerms as &$searchTerm) {
            $searchTerm = preg_replace(
                ['/\\\\?\S\K(?=\S)/', '/\s+/'],
                ['\\s*', '\\s+'],
                preg_quote($searchTerm, '/')
            );
        }
        $pattern = '/\b(' . implode("|", $searchTerms) . ')\b/i';
        echo $pattern . "\n";
        return (bool)preg_match($pattern, $stringToBeSearched);
    }
    
    var_export(
        searchSomeText(
            ['at', 'cat ', 'the'],
            'The catheter in the hat'
        )
    );
    
    /\b(a\s*t|c\s*a\s*t\s+|t\s*h\s*e)\b/i
    true