2015-10-14 277 views
1

的字符串我有两个字符串检查字符串的子是另一个字符串

$Str1 = "A B C D E F G H I J"; 
$Str2 = "1 2 C D E P Q R"; 

现在我必须检查的$Str2出口在$Str1一子。例如在这种情况下,C D E

这是一个基本和简单的例子。我有复杂的案例,两个字符串中的数据都是动态的。

如果我不得不比较完整的字符串,strpos是解决方案,但在这种情况下该怎么办?

+1

是否为了此事?在不同位置的字符是否匹配?你需要返回特定的字符和他们的位置?空间字符怎么样 - 它们显然存在于两个字符串中,但我猜你不会数这些字符?单个字符是匹配还是需要查找长度最小的字符串?就目前而言,这个问题太模糊,无法回答 – Steve

+0

@Steve,立场无关紧要。我只需要如果字符串的子串作为其他字符串中的子串退出。我必须匹配完整的单词。这是一个基本的例子,我在两个字符串中都有实际的文本。在我的字符串中不会有字符,但如果我正在检查这两个字,字符和字符串的两个字应该在其他字符串中。 –

+1

好吧,或许你需要用一个更现实的例子来编辑你的问题,因为目前它真的不清楚。 – Steve

回答

2

这个功能应该工作的任何字符串

function test($str1, $str2) 
{ 
    for ($i = strlen($str1); $i != 0; $i--) { 
     for ($x = 0; $x < strlen($str1) - $i; $x++) { 
      if (($pos = strpos($str2, substr($str1, $x, $i + 1))) !== false) { 
       return substr($str1, $x, $i + 1); 
      } 
     } 
    } 
    return null; 
} 

它返回的最大可能匹配或无效。

$str1 = "Sed ut perspiciatis unde omnis iste natus error sit voluptatem"; 
$str2 = "Sed ut perspiciatis undeT omnis iste natus error sit voluptatem"; 
echo test($str1, $str2); // omnis iste natus error sit voluptatem 
+0

谢谢,正是我所要求的。 –

1

这个功能应该为你工作:

<?php 
$Str1 = "A B C D E F G H I J"; 
$Str2 = "1 2 C D E P Q R"; 

echo strCompare($Str1, $Str2); //Returns C D E 

function strCompare($Str1, $Str2) { 
    $str1 = explode(" ", $Str1); 
    $str2 = explode(" ", $Str2); 

    $match = false; 
    $newStr = []; 

    foreach($str1 as $key => $value){ 
     if($match == true){ 
      if(isset($str2[$key]) && $str2[$key] == $value){ 
       $newStr[] = $value; 
      } else { 
       break; 
      } 
     } else { 
      if(isset($str2[$key]) && $str2[$key] == $value){ 
       $match = true; 
       $newStr[] = $value; 
      } 
     } 
    }; 

    return implode(" ",$newStr); 

} 
+0

我试过了,但没有奏效。 Kanti提供的解决方案完全按照我所需的方式工作。 感谢您的帮助,虽然:) –

+0

如果这不起作用,那么你有一个非常古老的PHP版本(PHP 5.4 <)。你应该升级它。 – Daan

0

也许这一个也会有所帮助:

<?php 
/** 
* returns an array of positions and substrings of needle that were found 
* in string haystack using a minimal and maximal substring length 
* 
* @param unknown $haystack find substrings of needle in this string 
* @param unknown $needle substrings in needle will be searched in haystack 
* @param number $min minimal length of a substring 
* @param number $max maximum length of a substring 
* @return array empty if no result 
*/ 
function intersect_string($haystack,$needle,$min=3,$max=25) 
{ 
    $r = []; 
    for($j=$i=0;isset($needle[$i])&&isset($needle[$i+1]);$j=0,$i++) { 
     if (!($c=$needle[$i].$needle[$i+1])) continue; 
     while (($p=strpos($haystack,$c,$j))!==false) { 
      $r[$p] = $c; 
      for ($j=$p+2,++$i;isset($needle[$i+1])&&isset($haystack[$j]);$j++,$i++) { 
       if (!($needle[$i+1]==$haystack[$j])) break; 
       $r[$p] .= $haystack[$j]; 
      } 
      $l = strlen($r[$p]); 
      if ($l<$min||$l>$max) { unset($r[$p]); } 
     } 
    } 
    return $r; 
} 
header('Content-Type:text/plain'); 
$str1 = "A little wolf is jumping over the tiny cow"; 
$str2 = "A tiny cow is jumping over the little wolf"; 
var_dump(intersect_string($str1,$str2,2)); 
var_dump(intersect_string($str1,$str2,3,12)); 
$str1 = "A B C D E F G H I J"; 
$str2 = "1 2 C D E P Q R"; 
var_dump(intersect_string($str1,$str2,1)); 
var_dump(intersect_string($str1,$str2,8)); 
$str1 = "Sed ut perspiciatis unde omnis iste natus error sit voluptatem"; 
$str2 = "Sed ut perspiciatis undeT omnis iste natus error sit voluptatem"; 
var_dump(intersect_string($str1,$str2,3,40)); 
?> 

这将导致:

array(4) { 
    [0]=> 
    string(2) "A " 
    [34]=> 
    string(8) "tiny cow" 
    [13]=> 
    string(21) " is jumping over the " 
    [2]=> 
    string(11) "little wolf" 
} 
array(2) { 
    [34]=> 
    string(8) "tiny cow" 
    [2]=> 
    string(11) "little wolf" 
} 
array(1) { 
    [3]=> 
    string(7) " C D E " 
} 
bool(false) 
array(2) { 
    [0]=> 
    string(24) "Sed ut perspiciatis unde" 
    [24]=> 
    string(38) " omnis iste natus error sit voluptatem" 
} 
相关问题