2016-06-29 14 views
6

Chciałbym znaleźć część ciągu znaków i jeśli chcę uzyskać cały ciąg znaków, który on znajdzie.Znajdź część ciągu znaków i wypisz cały ciąg

Poniżej jest przykład:

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

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

Jeśli ktoś może rzucić nieco światła na to, jak to zrobić, jak również i miej na uwadze, że nie będzie wartości statyczne; zmienne $Towns i $Find zostaną dynamicznie przypisane do mojego skryptu na żywo.

+0

Składnia jest 'strstr ($ stogu siana, $ igła)', więc prawdopodobnie znaczy 'strstr ($ miastach, $ Znajdź)' zamiast 'strstr ($ Znajdź $ miejscowości)' – PaulH

Odpowiedz

5

Zastosowanie explode() i strpos() jak

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

DEMO

+0

Z 'explode()', ciąg jest konwertowany do tablicy, a tablica jest wyszukiwanym elementem za sztukę. Rozwiązanie 'preg_match()' nie konwertuje do tablicy, ale wyszukiwanie jest bardziej złożone. – PaulH

1

Byłaś prawie tam ...

To jest chyba to, czego szukasz:

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

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

Wyjście jest: Eccleston, Aberdeen, Glasgow który nazwałbym „cały łańcuch”.


Jeśli jednak chcesz tylko wyjście, które częściowo dopasowane część z „całego łańcucha”, a następnie przyjrzeć się tej przykład:

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

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

Wyjście że oczywiście jest: Eccleston ...

Dwa uwagi ogólne:

  1. funkcje lepiej pasują tutaj, ponieważ zwracają tylko pozycję zamiast całego dopasowanego ciągu, który jest wystarczający dla danego celu.

  2. wykorzystanie stripos() zamiast strpos() wykonuje wyszukiwanie z uwzględnieniem wielkości liter, która prawdopodobnie ma sens dla zadania ...

+1

Chyba chce wyjście Eccleston nie cały ciąg. – Swolschblauw

+0

@Swolschblauw Nie jestem pewien, ale dodałem wersję zmodyfikowaną w tym kierunku. Dziękuję za wzmiankę o tym ... – arkascha

+0

@Swolschblauw, dziękuję, na początku tego nie zrozumiałem. – PaulH

1

Korzystanie preg_match(), możliwe jest, aby szukać Eccle i powrócić słowo Eccleston .

Używam wyrażenia regularnego zgodnego z Pearl (PCRE) '#\w*' . $Find . '\w*#' w poniższym kodzie i kodem demo.

Znaki # są ogranicznikami PCRE. Przeszukiwany wzorzec znajduje się wewnątrz tych ograniczników. Niektórzy wolą / jako ogranicznik.
Znaki \w oznaczają znaki .
Numer * oznacza 0 lub więcej powtórzeń poprzedniego znaku.
Tak, #\w*Eccle\w*# PCRE wyszukuje ciąg zawierający Eccle otoczony jednym lub więcej słowa znaków (litery)

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

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

kod trwania: http://sandbox.onlinephpfunctions.com/code/4e4026cbbd93deaf8fef0365a7bc6cf6eacc2014

Uwaga: '#\w*' . $Find . '\w*#' jest taka sama jak "#\w*$Find\w*#" (uwaga na otaczające pojedyncze lub podwójne cudzysłowy). Zobacz this.

+1

To z pewnością _nie wyjdzie "Eccleston" ... – arkascha

+0

@arkascha Nie do końca zrozumiałem pytanie na początku, rozwiązanie jest zaadaptowane – PaulH

1

Musisz użyć strpos() aby wyszukać ciąg wewnątrz innego wyjścia:

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

Zauważ, że musisz użyć „===”, aby wiedzieć, czy strpos() zwróciła false lub 0.

1

rozwiązanie wykorzystujące preg_match funkcję:

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

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

print_r($result); // "Eccleston" 
+0

@PaulH, jesteś w błędzie. Sprawdź swój kod testowy pod kątem literówek ... i przeczytaj o zmiennych interpolacja – RomanPerekhrest

+0

To, że PCRE jest zbyt skomplikowane, dlaczego nie "/ \ w * $ Znajdź \ w * /" ' – PaulH

+0

zapomniałeś o operatorach niewinnych i granicach słów – RomanPerekhrest

1

Zakładając, że zawsze będziesz miał $ Miasta oddzielone „” to można zrobić coś takiego

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

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

Powyższy kod wyświetli Town raz znajduje igłę i wychodzi z pętli foreach. Możesz usunąć "przerwę"; aby kontynuować uruchamianie skryptu, aby sprawdzić, czy znajdzie więcej wyników.

Powiązane problemy