的字符串我有兩個字符串檢查字符串的子是另一個字符串
$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是解決方案,但在這種情況下該怎麼辦?
的字符串我有兩個字符串檢查字符串的子是另一個字符串
$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是解決方案,但在這種情況下該怎麼辦?
這個功能應該工作的任何字符串
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
謝謝,正是我所要求的。 –
這個功能應該爲你工作:
<?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);
}
我試過了,但沒有奏效。 Kanti提供的解決方案完全按照我所需的方式工作。 感謝您的幫助,雖然:) –
如果這不起作用,那麼你有一個非常古老的PHP版本(PHP 5.4 <)。你應該升級它。 – Daan
也許這一個也會有所幫助:
<?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"
}
是否爲了此事?在不同位置的字符是否匹配?你需要返回特定的字符和他們的位置?空間字符怎麼樣 - 它們顯然存在於兩個字符串中,但我猜你不會數這些字符?單個字符是匹配還是需要查找長度最小的字符串?就目前而言,這個問題太模糊,無法回答 – Steve
@Steve,立場無關緊要。我只需要如果字符串的子串作爲其他字符串中的子串退出。我必須匹配完整的單詞。這是一個基本的例子,我在兩個字符串中都有實際的文本。在我的字符串中不會有字符,但如果我正在檢查這兩個字,字符和字符串的兩個字應該在其他字符串中。 –
好吧,或許你需要用一個更現實的例子來編輯你的問題,因爲目前它真的不清楚。 – Steve