检查特定字符串是否存在而不考虑空格或任何换行符

时间:2018-02-23 05:26:49

标签: php regex

我想检查内容中是否存在特定字符串,而不考虑空格差异或换行符。

案例1

  • 输入字符串:this is a sample test
  • 检查字词:asample test

案例2

  • 输入字符串:sample test1 \n new line content
  • 检查字词:test1 new

2 个答案:

答案 0 :(得分:1)

在检查字符串是否包含模式之前,您可以使用以下逻辑从模式字符串和要分析的字符串中删除所有空格字符。

<强>原型:

$input1='this is a sample test';
$inputFiltered1= str_replace('\s', '', $input1);
$pattern1='asample test';
$patternFiltered1= str_replace('\s', '', $pattern1);

$input2='sample test1 \n new line content';
$inputFiltered2= str_replace('\s', '', $input2);
$pattern2='test1 new';
$patternFiltered2= str_replace('\s', '', $pattern2);

if (strpos($inputFiltered1, $patternFiltered1) !== false) {
    echo 'true';
}

if (strpos($inputFiltered2, $patternFiltered2) !== false) {
    echo 'true';
}

答案 1 :(得分:0)

方法#1:纯正则表达式,$input未经修改

$pattern='~'.preg_replace('~\S(?!$)\K\s*~','\s*',$check).'~';
if(preg_match($pattern,$input)){
    echo "Found: $check";
}else{
    echo "Did Not Find: $check";
}

方法#2:$input$check

的正则表达式修改
if (strpos(preg_replace('~\s+~', '', $input), preg_replace('~\s+~', '', $check))!==false){
    echo "Found: $check";
}else{
    echo "Did Not Find: $check";
}

方法#3:$input$check

的无正则修改
$whitechars=[' ',"\t","\r","\n"];  // hardcode whitespace characters
if (strpos(str_replace($whitechars, '', $input), str_replace($whitechars, '', $check))!==false){
    echo "Found: $check";
}else{
    echo "Did Not Find: $check";
}

Demonstrations Link

现在,您可能会问:&#34; 我应该为项目选择哪一个?&#34;

正确回答首先取决于$input数据的大小和内容,然后是您运行此代码段的次数,然后是个人偏好,可能最不重要的是大小和内容$check

  1. 如果您的$input数据相对较大,那么您将希望避免对字符串执行任何修改,因为它会影响速度。假设您的$check字符串通常非常小,单独修改此值将产生最小的&#34;拖动&#34;在执行时间。作为一般答案,我建议方法#1 ;虽然它使用了两个preg_调用,但它们正在处理一个非常小的字符串。我应该解释一下,方法#1只通过在所有可见字符之间放置$check来准备\s*值。如果字符串中有任何空格字符,则在模式准备期间将其删除(假设$check中没有前导或尾随空白字符 - 否则,请调用trim()或优化模式准备)。 (Method #1 Pattern Demo

  2. 如果您想通过删除所有出现的空白字符来同时准备$input$check,那么最直接的方法是在一个或多个preg_replace()上调用\s { {1}}字符并替换为空字符串(方法#2 )。这将告诉正则表达式引擎隔离空格的子串并通过&#34;单次扫描&#34;给定字符串。相比之下,如果要避免使用正则表达式函数,可以使用str_replace()执行相同的任务。但是,使用方法#3 意味着您需要单独&#34;通知&#34;要删除的所有字符的功能。 str_replace()并不知道\s的含义。不幸的是,通过在数组中列出空白字符,该函数将执行n&#34;迭代扫描&#34;字符串AND它一次只能替换一个字符。

  3. 要结晶,如果您的字符串包含a[space][newline][newline][tab][space]b,那么preg_replace()将扫描字符串一次并进行单次替换。如果您在同一个字符串上调用str_replace(),则会进行四次扫描(请记住:[' ',"\t","\r","\n"])并进行五次单独替换。

    我想我正在开车回家的信息是:正则表达式有时会得到一个糟糕的说唱,但这似乎是一个令人信服的案例,选择一个非正则表达式方法的正则表达式方法(除非你对你的实际项目进行基准测试并发现事实上,正则表达式方法对性能产生了负面影响。)