$str1 = "HEADINGLEY";
$str2 = "HDNGLY";
我怎麼能SEACH串1,看它是否包含字符串2訂單中所有的人物角色,他們在串2存在,返回true或false值?搜索字符串
任何幫助表示讚賞:d
如果這能幫助,這是我的代碼有TODATE ..
echo preg_match('/.*H.*D.*N.*G.*L.*Y.*/', $str1, $matches);
返回0
$str1 = "HEADINGLEY";
$str2 = "HDNGLY";
我怎麼能SEACH串1,看它是否包含字符串2訂單中所有的人物角色,他們在串2存在,返回true或false值?搜索字符串
任何幫助表示讚賞:d
如果這能幫助,這是我的代碼有TODATE ..
echo preg_match('/.*H.*D.*N.*G.*L.*Y.*/', $str1, $matches);
返回0
我想我會用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)) . ".*/";
準確地說,這將是最快和最漂亮的方式檢查一下。 – 2012-03-09 15:04:54
是的,這是更快,尤其是當對488meg的字符串文件我有! 謝謝大家:D – Deano 2012-03-12 21:13:45
你可以使用一些正則表達式匹配像.*H.*D.*N.*G.*L.*Y.*
和preg_match
。
應該很容易在第二個字符串中添加.*
。
想象一下,你的字符串是數組,然後使用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;
訂單在問題中很重要 - 這不像使用array_diff那麼簡單 – 2012-03-09 14:51:02
只是添加結果與空數組比較,3分鐘,我會提供代碼示例 – Electronick 2012-03-09 14:53:26
使用http://stackoverflow.com/questions/3279202/php-convert-string-to-array部分 – Electronick 2012-03-09 14:58:41
此代碼正則表達式是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;
可能這個片段將做到這一點:
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);
}
可以使用pre_match功能,像:
$split_str2 = str_split($str2);
// Create pattern from str2
$pattern = "/" . implode(".*", $split_str2) . "/";
// Find
$result = preg_match($pattern, $str1);
你或許可以使用一些正則表達式,但厭倦串的那包含正則表達式特定字符。該解決方案以編程方式執行。
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;
}
你可以試試:
$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"
這個工作:D非常感謝 – Deano 2012-03-09 17:18:34
正則表達式中的「/」字符是做什麼的?我從來沒有使用過PHP,但是「H. * D. * N. * G. * L. * Y」是一個正確的匹配正則表達式。 – svinja 2012-03-09 15:00:37
「/」用作字符串中表達式的開始符號 – Electronick 2012-03-09 15:11:11
我已經用$ str2轉換爲模式更新了我的答案 – dldnh 2012-03-09 15:15:17