Поиск символов в строке - PullRequest
1 голос
/ 09 марта 2012
$str1 = "HEADINGLEY";
$str2 = "HDNGLY";

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

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

если это поможет, это код, который я должен обновлять ..

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

возвращает 0

Ответы [ 8 ]

1 голос
/ 09 марта 2012

Полагаю, я бы использовал 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 голосов
/ 09 марта 2012

Вы можете попробовать:

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

ВЫВОД:

string(10) "HEADINGLEY"
0 голосов
/ 09 марта 2012

Вы, вероятно, можете использовать какое-то регулярное выражение, но быть усталым от строк, содержащих определенные символы регулярного выражения. Это решение делает это программно.

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 голосов
/ 09 марта 2012

Вы можете использовать функцию pre_match, например:

$split_str2 = str_split($str2);
// Create pattern from str2
$pattern = "/" . implode(".*", $split_str2) . "/";
// Find
$result = preg_match($pattern, $str1);
0 голосов
/ 09 марта 2012

Возможно, этот фрагмент сделает это:

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 голосов
/ 09 марта 2012

Этот код написан на 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 голосов
/ 09 марта 2012

Представьте, что ваша строка является массивом, и после этого используйте функцию 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 голосов
/ 09 марта 2012

Вы можете использовать некоторое совпадение с регулярным выражением, например .*H.*D.*N.*G.*L.*Y.* и preg_match.

Должно быть достаточно просто добавить .* во вторую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...