2016-09-21 1 views
1

Vielleicht kann dieses Problem nicht gelöst werden, wie ich will, aber vielleicht können Sie mir helfen Jungs.Regex Regeln in einem Array

Ich habe viele falsch geschriebene Wörter im Namen meiner Produkte.

Einige von ihnen ( und Hinter ) oder vielleicht einer von ihnen hat sich führt, ist es für / und " Zeichen gleich.

Was ich tue ist, dass ich den Namen des Produkts durch Leerzeichen explodiere, und diese Wörter untersucht.

Also ich will sie zu nichts ersetzen. Aber eine Festplatte könnte 40GB ATA 3.5" hard drive sein. Ich muss das ganze Wort verarbeiten, aber ich kann nicht die gleiche Methode für 3.5" wie für () oder // verwenden, weil diese 3.5" gültig ist.

Also muss ich nur die Anführungszeichen ersetzen, wenn es am Anfang der Zeichenfolge und am Ende der Zeichenfolge ist.

$cases = [ 
    '(testone)', 
    '(testtwo', 
    'testthree)', 
    '/otherone/', 
    '/othertwo', 
    'otherthree/', 
    '"anotherone', 
    'anothertwo"', 
    '"anotherthree"', 
]; 
$patterns = [ 
    '/^\(/', 
    '/\)$/', 
    '~^/~', 
    '~/$~', 
    //Here is what I can not imagine, how to add the rule for `"` 
]; 
$result = preg_replace($patterns, '', $cases); 

Das ist gut funktioniert, aber kann es in einem regex_replace() getan werden? Wenn ja, kann jemand mir die Muster für die Zitate helfen?

Ergebnis für Zitate sollte dies sein:

'"anotherone', //no quote at end leave the leading 
'anothertwo"', //no quote at start leave the trailin 
'anotherthree', //there are quotes on start and end so remove them. 
+0

Bedeutet es, Sie brauchen 2 regexps - 1) zunächst für einen '“ 'wenn der String endet mit' '' '' '' '' '' '' '' '' 'und '2' für ein abschließendes '' 'wenn das erste' '' war (keine Möglichkeit für das aktuelle Ansatz)? –

+0

@ WiktorStribiżew Quotes können nur ersetzt werden, wenn das erste Zeichen ein '' 'ist und das letzte Zeichen' '' quote too, und shold nur diese 2 Anführungszeichen ersetzt werden. – vaso123

Antwort

1

Sie einen anderen Ansatz verwenden: anstatt eine Reihe von Mustern zu definieren, verwenden einen einzigen Wechsel auf Basis regex:

Siehe regex demo

Einzelheiten:

  • ^[(/] - eine wörtliche ( oder / zu Beginn der Zeichenfolge
  • | - oder
  • [/)]$ - eine wörtliche ) oder / am Ende des Strings
  • | - oder
  • ^"(.*)"$ - eine " am Anfang der Zeichenfolge, dann alle 0+ Zeichen (aufgrund /s Option, die . entspricht auch eine Zeilenumbrüche Sequenz), die in Gruppe 1 und " am Ende der Zeichenfolge erfasst werden.

Die Ersetzungsmuster sind $1, die leer ist, wenn die ersten 2 Alternativen angepasst sind, und enthält die Gruppe 1-Wert, wenn die 3. Alternative angepasst ist.

Hinweis: Im Fall, dass Sie ersetzen, bis keine Übereinstimmung gefunden wird, verwenden Sie einen preg_match mit preg_replace zusammen (siehe demo):

$s = '"/some text/"'; 
$re = '~^[(/]|[/)]$|^"(.*)"$~s'; 
$tmp = ''; 
while (preg_match($re, $s) && $tmp != $s) { 
    $tmp = $s; 
    $s = preg_replace($re, '$1', $s); 
} 
echo $s; 
+1

Es funktioniert super ... Danke! Ich freue mich, den Beitrag zu löschen und Ihre Antwort zu akzeptieren. – vaso123

+0

Ich habe es nicht gelöscht, weil ich keine Antwort bekomme, da du meinen Ruf siehst, bin ich SO ein bisschen vertraut. Ich habe es gelöscht, weil, als Sie gefragt haben, ich dachte, meine Frage ist nicht klar genug, und als ich auf Ihre Frage geantwortet habe, habe ich gefühlt, es wird Sie nicht näher führen, um zu verstehen. Wie auch immer, ich habe eine Frage zu Ihrer Lösung, bitte. – vaso123

+0

Sorry, sicher. Wenn Sie meine Geschichte überprüfen, werden Sie sehen, ich bin nicht versiert in Frage fragen :(Habe nur den Grund nicht verstanden. Sicher, ich werde froh sein, jeden Zweifel zu klären. –

0

Dies funktioniert

preg_replace([[/(]?(.+)[/)]?|/\"(.+)\"/], '$1', $string) 
+0

Ja, aber es kann nicht mit meinem '$ pattersn'-Array gemischt werden, denn im anderen Fall ersetze ich Ergebnisse zu nichts, während Sie für '' $ 1'' – vaso123

+0

Ich bearbeitete die Antwort auf einmal zu arbeiten. ist das in Ordnung? –

+0

und Sie können diese Seite verwenden, um es zu testen https://www.functions-online.com/preg_replace.html –