Frage

Ich versuche also, ein Skript zu erstellen, das gültigen Spaltennamen automatisch das entsprechende Tabellenpräfix voranstellt (z. B."T." oder "r.")

$t_columns = array('id', 'name', 'label');
$r_columns = array('related_value');

EINGANG:

id > 1 AND (name = 'Hello' OR label IN ('World', 'Planet name AND label')) AND (related_value > 1 AND related_value < 50)

AUSGABE:

t.id > 1 AND (t.name = 'Hello' OR t.label IN ('World', 'Planet name AND label')) AND (r.related_value > 1 AND r.related_value < 50)

Beachten Sie, dass Sie kein Normales tun können str_replace.Was wäre der einfachste Code (ich vermute preg_replace), um sicherzustellen, dass alle Tabellennamen richtig vorangestellt werden?

War es hilfreich?

Lösung

Dies kann auf viele Arten erfolgen, und auch regex. Ich würde persönlich ein Array Ansatz. Zunächst einmal würde ich die Mangeln Tabelle auf diese Art und Weise definiert werden:

$table = array(
    'id' => 't.id',
    'name' => 't.name',
    'label' => 't.label',
    'related_value' => 'r.related_value'
);

Das wird viel einfacher, die str_replace () Anruf:

function mangling(&$v, $k, $table)
{
    if (($k & 1) == 0)
        $v = str_replace(array_keys($table), array_values($table), $v);
}

$spans = explode("'", ' ' . $input);
array_walk($spans, 'mangling', $table);
$output = implode("'", $spans);

Andere Tipps

Nach ein paar Sekunden Überlegung würde ich es folgendermaßen angehen:

Gehen Sie die Zeichenfolge Zeichen für Zeichen durch und suchen Sie nach einfachen Anführungszeichen, überspringen Sie jedoch die Escape-Zeichen.Das Zeug zwischen zwei einfachen Anführungszeichen ohne Escapezeichen (d. h.die Zeichenfolgen) würden durch ein eindeutiges Token ersetzt und in ein assoziatives Array eingefügt, mit diesem Token als Schlüssel und der ursprünglichen Zeichenfolge als Wert.

Nachdem wir nun die Schnüre aus dem Weg geräumt haben, führen Sie Folgendes aus: str_replace() (oder preg_replace(), wenn Sie darauf bestehen) für die bekannten Spaltennamen.Ich würde die Spaltennamen wahrscheinlich in einem assoziativen Array konstruieren, mit dem Alias ​​der Tabelle als Schlüssel und dem Wert als Aufzählungsarray, das die Spaltennamen enthält.Auf diese Weise könnte der Austausch automatisiert werden.

Sobald die Tabellennamen ausgefüllt sind, führen Sie einfach einen aus str_replace() für die Token, um die ursprünglichen Zeichenfolgen wieder an ihren Platz zu ersetzen, und schon sind Sie fertig.

Ich bin mir sicher, dass jemand einen supertollen (und wahrscheinlich fast nicht wartbaren) regulären Ausdruck erstellen könnte, um all dies auf einen Schlag zu erledigen.Aber ich ziehe es vor, reguläre Ausdrücke nur in Situationen zu verwenden, in denen reguläre Ausdrücke tatsächlich das richtige Werkzeug sind, und nicht, wenn eine CFL besser geeignet wäre.

Ich weiß nicht, ob ein regulärer Ausdruck ist eine gute Idee hier. Ich würde sagen, es ist die minimale Menge an erhöhten Rechenaufwand lohnen würde die Validierung selbst in PHP auszuführen. Dann sollten Sie Ihre Datenbank alle Änderungen erfordern, werden Sie nicht Ihr Haar haben, ziehen Sie sich Gedanken darüber, wie die Robustheit des regulären Ausdrucks zu erhöhen.

Als Jamie Zawinski hat einmal gesagt: „Einige Leute, wenn sie mit einem Problem konfrontiert, denken:‚Ich weiß, werde ich reguläre Ausdrücke verwenden.‘ Jetzt haben sie zwei Probleme. „

Im Hinblick auf einen Workflow zu schaffen, die sicherstellen, werden Sie auf der rechten Seite Datenbank arbeiten, würde ich prüfen, einen objektorientierten Ansatz. Klassen für T- und R-Tabellen können Kinder einer Modellklasse verantwortlich für den Aufbau des richtige tabellenartigen Objekts mit bedingter Logik innerhalb der gleichen Methode, sondern als ein regex instanziert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top