Найдите часть строки и выведите всю строку


Я хотел бы найти часть строки, и если true я хочу получить всю строку, которую он находит.

Ниже приведен пример:

$Towns = "Eccleston, Aberdeen, Glasgow";
$Find = "Eccle";

if(strstr($Find, $Towns)){
    echo outputWholeString($Find, $Towns); // Result: Eccleston.
}

Если кто-то может пролить свет на то, как это сделать, а также иметь в виду, что это не будут статические значения; переменные $Towns и $Find будут динамически назначаться в моем Живом скрипте.

6 6

6 ответов:

Используйте explode() и strpos() как

$Towns = "Eccleston, Aberdeen, Glasgow";
$data=explode(",",$Towns);// 
$Find = "Eccle";
foreach ($data as $town)
if (strpos($town, $Find) !== false) {
    echo $town;
}

Демо-версия

Вы должны использовать strpos () для поиска строки внутри другой:

if( strpos($Towns, $Find) === false ) {
    echo $Towns;
}

Обратите внимание, что вы должны использовать"===", чтобы узнать, возвращает ли strpos() false или 0.

Решение с использованием функции preg_match:

$Towns = "Eccleston, Aberdeen, Glasgow";
$Find = "Eccle";

preg_match("/\b\w*?$Find\w*?\b/", $Towns, $match);
$result = (!empty($match))? $match[0] : "";

print_r($result);   // "Eccleston"

Предполагая, что у вас всегда будут $ города, разделенные", " тогда вы могли бы сделать что-то вроде этого

$Towns = "Eccleston, Aberdeen, Glasgow";
$Find = "Eccle";    
$TownsArray = explode(", ", $Towns);

    foreach($TownsArray as $Town)
    {
       if(stristr($Find, $Town))
       { 
          echo $Town; break;
       }
    }

Приведенный выше код выведет город, как только он найдет иглу и выйдет из цикла foreach. Вы можете удалить " break;", чтобы продолжить выполнение сценария, чтобы увидеть, если он найдет больше результатов.

Используя preg_match(), можно искать Eccle и возвращать слово Eccleston.

Я использую Pearl Compatible Regular Expression (PCRE) '#\w*' . $Find . '\w*#' в приведенном ниже коде и demo коде.

Символы # являются разделителями PCRE. Искомый шаблон находится внутри этих разделителей. Некоторые люди предпочитают / в качестве разделителя.
\w обозначаетслово символы.
* обозначает 0 или более повторений предыдущего символа.
Итак, #\w*Eccle\w*# PCRE ищет строку, содержащую Eccle, окруженную одним или несколькими словами символами ( буквами )

<?php
$Towns = "Eccleston, Aberdeen, Glasgow";
$Find = "Eccle";

if (preg_match('#\w*' . $Find . '\w*#', $Towns, $matches)) {
    print_r($matches[0]);
}
?>

Запущенный код: http://sandbox.onlinephpfunctions.com/code/4e4026cbbd93deaf8fef0365a7bc6cf6eacc2014

Примечание: '#\w*' . $Find . '\w*#' совпадает с "#\w*$Find\w*#" (обратите внимание на окружающие одинарные или двойные кавычки). Смотрите это.

Вы были почти там...

Это, вероятно, то, что вы ищете:

<?php
$Towns = "Eccleston, Aberdeen, Glasgow";
$Find = "Eccle";

if(stripos($Towns, $Find)) {
    echo $Towns;
}

Вывод: Eccleston, Aberdeen, Glasgow это то, что я бы назвал "целой строкой".


Если, однако, вы хотите вывести только частично совпадающую Часть "всей строки", то посмотрите на этот пример:

<?php
$Towns = "Eccleston, Aberdeen, Glasgow";
$Find = "Eccle";

foreach (explode(',', $Towns) as $Town) {
    if(stripos($Town, $Find)) {
        echo trim($Town);
    }
}

Вывод этого, очевидно, таков: Eccleston...

Два общих замечания:

  1. Тот Самый strpos() / stripos() функции здесь подходят лучше, так как они возвращают только позицию вместо всей совпадающей строки, которой достаточно для данной цели.

  2. Использование stripos() вместо strpos() выполняет поиск без учета регистра, что, вероятно, имеет смысл для данной задачи...