2016-06-29 58 views
6

Vorrei trovare una parte di una stringa e se true voglio estrarre l'intera stringa trovata.Trova parte di una stringa e restituisce l'intera stringa

Di seguito un esempio:

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

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

Se chiunque può far luce su come fare anche questo, e nudo in mente che non sarà valori statici; le variabili $Towns e $Find verranno assegnate dinamicamente al mio script live.

+0

La sintassi è 'strstr ($ haystack, $ needle)', quindi probabilmente intendete 'strstr ($ Towns, $ Find)' invece di 'strstr ($ Find, $ Towns)' – PaulH

risposta

5

Usa explode() e strpos() come

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

DEMO

+0

Con 'explode()', la stringa viene convertita in un array e l'array viene cercato elemento per articolo. La soluzione 'preg_match()' non converte in array ma la ricerca è più complessa. – PaulH

1

Eri quasi arrivati ​​...

Questo è probabilmente quello che stai cercando:

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

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

L'output è: Eccleston, Aberdeen, Glasgow che è quello che chiamerei "l'intera stringa".


Se invece si desidera solo in uscita che in parte ha trovato parte di "l'intera stringa", allora date un'occhiata a questo esempio:

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

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

L'uscita che, ovviamente, è: Eccleston ...

Due osservazioni di carattere generale:

  1. le funzioni strpos()/stripos() sono più adatte qui, poiché restituiscono solo una posizione anziché l'intera stringa abbinata che è sufficiente per lo scopo dato.

  2. l'utilizzo di stripos() invece di strpos() esegue una ricerca non insensibile, che probabilmente ha un senso per l'attività ...

+1

Penso che voglia emettere Eccleston non l'intera stringa. – Swolschblauw

+0

@Swolschblauw Non sono sicuro, ma ho aggiunto una versione modificata in quella direzione. Grazie per aver menzionato quella vista ... – arkascha

+0

@Swolschblauw, grazie, non l'ho capito all'inizio. – PaulH

1

Utilizzando preg_match(), è possibile cercare Eccle e restituire la parola Eccleston .

Uso l'espressione regolare compatibile perla (PCRE) '#\w*' . $Find . '\w*#' nel codice di seguito e il codice demo.

I caratteri # sono delimitatori PCRE. Il modello cercato è all'interno di questi delimitatori. Alcune persone preferiscono / come delimitatore.
Il \w indica parola caratteri.
Il * indica 0 o più ripetizioni del carattere precedente.
Così, il #\w*Eccle\w*# PCRE ricerche per una stringa contenente Eccle circondata da uno o più parola caratteri (lettere)

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

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

codice in esecuzione: http://sandbox.onlinephpfunctions.com/code/4e4026cbbd93deaf8fef0365a7bc6cf6eacc2014

Nota: '#\w*' . $Find . '\w*#' è lo stesso "#\w*$Find\w*#" (nota le virgolette singole o doppie circostanti). Vedi this.

+1

Questo sicuramente non produrrà "Eccleston" ... – arkascha

+0

@arkascha All'inizio non ho compreso completamente la domanda, la soluzione è stata adattata – PaulH

1

Devi usare strpos() per cercare una stringa all'interno di un altro:

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

Si noti che è necessario utilizzare "===" per sapere se strpos() ha restituito false o 0.

1

La soluzione utilizza preg_match funzione:

$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, ti sbagli. Controlla il tuo codice di prova per gli errori di battitura ... e leggi l'interpolazione delle variabili – RomanPerekhrest

+0

Quel PCRE mi sembra troppo complicato, perché non '"/\ w * $ Trova \ w */"' – PaulH

+0

hai dimenticato gli operatori ungreedy ei limiti delle parole – RomanPerekhrest

1

Supponendo che si avrà sempre $ Comuni separati da "" allora si potrebbe fare qualcosa di simile

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

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

Il codice di uscita sarà il centro di cui sopra, una volta trova l'ago ed esce dal ciclo di foreach. Potresti rimuovere la "pausa" per continuare a far eseguire lo script per vedere se trova più risultati.