2012-03-09 284 views
1
$str1 = "HEADINGLEY"; 
$str2 = "HDNGLY"; 

我怎麼能SEACH串1,看它是否包含字符串2訂單中所有的人物角色,他們在串2存在,返回true或false值?搜索字符串

任何幫助表示讚賞:d

如果這能幫助,這是我的代碼有TODATE ..

echo preg_match('/.*H.*D.*N.*G.*L.*Y.*/', $str1, $matches); 

返回0

+0

正則表達式中的「/」字符是做什麼的?我從來沒有使用過PHP,但是「H. * D. * N. * G. * L. * Y」是一個正確的匹配正則表達式。 – svinja 2012-03-09 15:00:37

+0

「/」用作字符串中表達式的開始符號 – Electronick 2012-03-09 15:11:11

+0

我已經用$ str2轉換爲模式更新了我的答案 – dldnh 2012-03-09 15:15:17

回答

1

我想我會用preg_match

http://us.php.net/manual/en/function.preg-match.php

...並使用str_split獲取數組轉向$str2爲正則表達式和implode將其回成".*"作爲字符之間的膠水的字符串。

http://us.php.net/manual/en/function.str-split.php http://us.php.net/manual/en/function.implode.php

Upate - 我應該建議str_split,而不是爆炸,是在這裏,將讓你的代碼從$str2

$str2pat = "/.*" . implode(".*", str_split($str2)) . ".*/"; 
+0

準確地說,這將是最快和最漂亮的方式檢查一下。 – 2012-03-09 15:04:54

+0

是的,這是更快,尤其是當對488meg的字符串文件我有! 謝謝大家:D – Deano 2012-03-12 21:13:45

0

你可以使用一些正則表達式匹配像.*H.*D.*N.*G.*L.*Y.*preg_match

應該很容易在第二個字符串中添加.*

0

想象一下,你的字符串是數組,然後使用array_diff函數。

http://hu2.php.net/array_diff

$str1 = "HEADINGLEY"; 
$str2 = "HDNGLY"; 

$arr1 = str_split($str1, 1); 
$arr2 = str_split($str2, 1); 

$arr2_uniques = array_diff($arr2, $arr1); 

return array() === $arr2_uniques; 
+0

訂單在問題中很重要 - 這不像使用array_diff那麼簡單 – 2012-03-09 14:51:02

+0

只是添加結果與空數組比較,3分鐘,我會提供代碼示例 – Electronick 2012-03-09 14:53:26

+0

使用http://stackoverflow.com/questions/3279202/php-convert-string-to-array部分 – Electronick 2012-03-09 14:58:41

0

此代碼正則表達式是C#,因爲我不知道PHP,但應該很容易理解。

 int index1 = 0, index2 = 0; 
     while (index1 < str1.Length && index2 < str2.Length) 
     { 
      if (str1[index1] == str2[index2]) index2++; 
      index1++; 
     } 
     if (index2 == str2.Length) return true; 
0

可能這個片段將做到這一點:

var contains = true; 

for (var i=0; i < str2.length; i++) 
{ 
    var char = str2.charAt(i); 
    var indexOfChar = str1.indexOf(char); 

    if (indexOfChar < 0) 
    { 
     contains = false; 
    } 

     str1 = str1.substr(indexOfChar); 
} 
0

可以使用pre_match功能,像:

$split_str2 = str_split($str2); 
// Create pattern from str2 
$pattern = "/" . implode(".*", $split_str2) . "/"; 
// Find 
$result = preg_match($pattern, $str1); 
0

你或許可以使用一些正則表達式,但厭倦串的那包含正則表達式特定字符。該解決方案以編程方式執行。

function contains_all_characters($str1, $str2) 
{ 
    $i1 = strlen($str1) - 1; 
    $i2 = strlen($str2) - 1; 

    while ($i2 >= 0) 
    { 
     if ($i1 == -1) return false; 
     if ($str1[$i1--] == $str2[$i2]) $i2--; 
    } 

    return true; 
} 
0

你可以試試:

$str = 'HEADINGLEY'; 
if (preg_match('/[^H]*H[^D]*D[^N]*N[^G]*G[^L]*L[^Y]*Y/', $str, $m)) 
    var_dump($m[0]); 

更新:更妙的是建立正則表達式這樣的,然後使用它:

$str = 'HEADINGLEY'; 
$pattern = 'HDNGLY'; 

$regex = '#' . preg_replace('#(.)#', '[^$1]*$1', $pattern) . '#'; 
if (preg_match($regex, $str, $m)) 
    var_dump($m[0]); 

OUTPUT:

string(10) "HEADINGLEY" 
+0

這個工作:D非常感謝 – Deano 2012-03-09 17:18:34