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

Как я могу найти строку 1, чтобы увидеть, содержит ли она все символы из строки 2 в порядке их существования в строке 2 и возвращает значение true или false?Поиск символов в строке

Любой помощь приветствуется: D

, если это помогает, это код у меня есть ФОРУМЕ ..

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

возвращает 0

+0

Что делают символы «/» в регулярном выражении? Я никогда не использовал PHP, но «H. * D. * N. * G. * L. * Y» - правильное соответствующее регулярное выражение для того, что вы хотите. – svinja

+0

«/» используется в качестве начальных символов выражения в строке – Electronick

+0

Я обновил свой ответ с помощью преобразования от $ str2 к шаблону – dldnh

ответ

1

Я предполагаю, что я хотел бы использовать preg_match

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

... и превращения $str2 в регулярное выражение с помощью str_split, чтобы получить массив и 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

Точно, это был бы самый быстрый и красивый способ Проверь это. –

+0

yep, это было намного быстрее, особенно когда вы побежали против 488meg файла строк, которые у меня есть !!! Спасибо всем: D – Deano

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' –

+0

просто добавьте результат сравнение с пустым массивом, 3 мин, и я приведу пример кода – Electronick

+0

Используемая часть http://stackoverflow.com/questions/3279202/php-convert-string-to-array – Electronick

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]); 

Update: Еще лучше построить регулярное выражение, как это и затем использовать его:

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

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

ВЫВОД:

string(10) "HEADINGLEY" 
+0

это сработало: D большое спасибо – Deano

Смежные вопросы