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

问题描述 投票:2回答:2

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

情况1

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

案例2

  • 输入字符串:sample test1 \n new line content
  • 检查一词:test1 new
php regex
2个回答
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';
}

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

(Qazxswpoi)

现在,您可能会问:“我应该为项目选择哪一个?”

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

  1. 如果您的$check数据相对较大,那么您将希望避免对字符串执行任何修改,因为它会影响速度。假设您的$input字符串通常非常小,单独修改此值将导致执行时间产生最小的“拖动”。作为一般答案,我建议方法#1;虽然它使用两个$check调用,但它们正在处理一个非常小的字符串。我应该解释一下,方法#1只通过在所有可见字符之间放置preg_来准备$check值。如果字符串中有任何空白字符,则在模式准备期间将其删除(假设\s*中没有前导或尾随空白字符 - 否则,请调用$check或精简模式准备)。 (trim()
  2. 如果你想通过删除所有出现的空格字符来准备Method #1 Pattern Demo$input,那么最直接的方法是在一个或多个$check字符上调用preg_replace()并用空字符串替换(方法#2)。这将告诉正则表达式引擎隔离空格的子串并通过给定字符串的“单次扫描”删除它们。相比之下,如果要避免使用正则表达式函数,可以使用\s执行相同的任务。但是,使用方法#3意味着您需要单独“通知”要删除的所有字符的功能。 str_replace()不知道str_replace()的意思。不幸的是,通过在数组中列出空白字符,该函数将执行字符串的\s“迭代扫描”并且它一次只能替换一个字符。

要结晶,如果你有一个包含n的字符串,那么a[space][newline][newline][tab][space]b将扫描字符串一次并进行一次替换。如果你在相同的字符串上调用preg_replace(),它将进行四次扫描(记住:str_replace())并进行五次单独的替换。

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

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