2015-10-14 278 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" 
} 
相關問題