2015-07-22 2 views
0

Как проверить подстроки в PHP с помощью префикса или постфикса. Например, у меня есть строка поиска по имени, как $to_search следующим образом:Аналогичная подстрока в другой строке PHP

$to_search = "abcdef" 

И три случая, чтобы проверить, если это подстрока в $ to_search следующим образом:

$cases = ["abc def", "def", "deff", ... Other values ...]; 

Теперь я должен обнаружение первых трех случаев с использованием функции substr(). Как определить "abc def", "def", "deff" как подстроку "abcdef" в PHP.

+0

Я не уверен, что понимаю. Вы хотите узнать, какие элементы массива $ case являются подстроками $ to_search? –

+0

@ jedrzej.kurylo Я хочу искать первые три в качестве подстроки $ to_search – developer

+0

Первые три элемента в $ case, которые являются подстроками $ to_search, правильно? –

ответ

0

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

$to_search = "abcdef"; 
$cases = ["abc def", "def", "deff", "otherabc", "noabcmatch", "nodefmatch"]; 

$matches = array(); 
$len = strlen($to_search); 
for ($i=1; $i <= $len; $i++) { 
    // get the beginning and end of the search string of length $i 
    $pre_post = array(); 
    $pre_post[] = substr($to_search, 0, $i); 
    $pre_post[] = substr($to_search, -$i); 

    foreach ($cases as $case) { 
     // get the beginning and end of each case of length $i 
     $pre = substr($case, 0, $i); 
     $post = substr($case, -$i); 

     // check if any of them match 
     if (in_array($pre, $pre_post) || in_array($post, $pre_post)) { 
      // using the case as the array key for $matches will keep it distinct 
      $matches[$case] = true; 
     } 
    } 
} 
// use array_keys() to get the keys back to values 
var_dump(array_keys($matches)); 
1

Это найдет, если какая-либо из строк внутри $ case является подстрокой $ to_search.

foreach($cases as $someString){ 
    if(strpos($to_search, $someString) !== false){ 
     // $someString is found inside $to_search 
    } 
} 

Только «def», хотя ни одна из других строк не имеет много общего друг с другом.

Также на стороне нет; это префикс и суффикс не постфикс.

+0

да, но я хочу также обнаружить остальные случаи. только «def» я пробовал раньше, но мне нужны остальные случаи, а также подстрока. – developer

+0

Боюсь, я не знаю, что вы имеете в виду.Этот цикл найдет любое слово, которое является подстрокой поискового термина. Примеры, которые вы указали, не являются подстроками поискового запроса, который вы дали. – Christian

+0

Да, вы правы, они не подстроки, но у них были подстроки в виде постфикса или префикса или подобных слов. Я хочу это проверить. – developer

2

Вы можете найти Levenshtein distance между двумя полезными словами: оно будет иметь значение 1 для abc def. Однако ваша проблема не определена правильно - сопоставление строк, которые являются «похожими», не означает ничего конкретного.

Редактировать - Если вы установили стоимость удаления в 0, то это очень сильно моделирует проблему, которую вы предлагаете. Просто убедитесь, что расстояние levenshtein меньше 1 для всего массива.

+1

@developer Я думаю, что это то, что вы хотите. Мера сходства текста, а не подстроки. Подстроки точны. Это эвристическое сравнение сходства. – Christian

0

Вы можете использовать array_filter функцию следующим образом:

$cases = ["cake", "cakes", "flowers", "chocolate", "chocolates"]; 
$to_search = "chocolatecake"; 
$search = strtolower($to_search); 

$arr = array_filter($cases, function($val) use ($search) { return 
    strpos($search, 
     str_replace(' ', '', preg_replace('/s$/', '', strtolower($val)))) !== FALSE; }); 

print_r($arr); 

Выход:

Array 
(
    [0] => cake 
    [1] => cakes 
    [3] => chocolate 
    [4] => chocolates 
) 

Как вы можете это печатает все значения, ожидаемые отдельно от deff, который не является частью строки поиска abcdef, как я уже говорил выше.

+0

Вы почти правы, но как обнаружить часть abcdef как def? – developer

+0

есть ли возможно, что также печатает deff? просто положить последнее слово как aspumtion? – developer

+0

в 'deff' и' abcdef' у нас есть общий 'def' – developer