2016-02-02 11 views
6

Ho bisogno di dividere una stringa in due utilizzando un carattere delimitatore. Tutto quello che devo fare è usare la funzione explode() ... lo so.Utilizzo di php per rilevare caratteri esterni alle virgolette

Ma ecco cosa sto cercando di fare: ho bisogno di dividere una stringa usando un delimitatore ma se il delimitatore è racchiuso tra virgolette dovrebbe essere ignorato.

Diciamo che la mia delimitatore è un trattino (-) e ho bisogno di dividere la seguente stringa:

Il 'big-giallo' casa-è vicino al lago

Il primo trattino deve essere ignorato perché è tra virgolette, quindi, avrei finito con due stringhe come questi:

1. la casa 'big-giallo'
2. è vicino al lago

Ed è anche dovrebbe essere in grado di rilevare le virgolette escape .

E.g .: A lui non piace perché non è di qui.

In questo caso il trattino non è tra virgolette quindi la stringa deve essere divisa.

Qualche idea?

+1

Per saltare citazioni sfuggiti, basta unire il riferimento con una lookback '(? mario

+1

Per rilevare il '-' che si verificano in una parola con le citazioni, io suggerisco di usare' Lookaround 'asserzioni. Tale trattino è seguito e preceduto da caratteri prima di ** incontrare ** un _quote_. –

+0

Questo non è un duplicato, poiché l'altra domanda non tratta affatto le citazioni con escape. Inoltre, le risposte non hanno buone spiegazioni su come funziona. – Will

risposta

2

È possibile utilizzare

'[^'\\]*(?:\\.[^'\\]*)*'(*SKIP)(?!)|- 

Vedi regex demo

La parte '[^'\\]*(?:\\.[^'\\]*)*' corrisponderà virgolette singole e qualsiasi sfuggito entità, e (*SKIP)(?!) costringerà il motore regex di andare a cercare corrispondenze dopo l'ultimo indice + lunghezza della partita

E qui è un IDEONE demo:

$re = "/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(*SKIP)(?!)|-/"; 
$strs = array("The 'big-yellow' house-is near the lake", "He doesn\'t like it because-he isn\'t from here."); 
foreach ($strs as $str) { 
    $result = preg_split($re, $str); 
    print_r($result); 
} 

uscita:

Array([0] => The 'big-yellow' house [1] => is near the lake) e Array([0] => He doesn\'t like it because [1] => he isn\'t from here.).

+1

Questo è esattamente quello che sto cercando! Grazie!!! –

1

Potrebbe essere qualcosa del genere?

function fsplit($str, $delimiter) 
{ 
    $result = array(); 
    $inside_quote = false; 
    $last_index = 0; 
    for($i=0; $i<strlen($str);$i++) 
    { 
     if($str[$i] == $delimiter and !$inside_quote) 
     { 
      array_push($result, substr($str, $last_index, $i - $last_index)); 
      $last_index = $i+1; 
     } 
     elseif($str[$i] == "'") 
     { 
      $inside_quote = !$inside_quote; 
     } 

    } 

    return $result; 
} 
Problemi correlati