it-swarm.com.de

PHP ruft jede Textzeile in jform ab

Ich baue eine Joomla 3-Komponente. In meinem XML-Dokument ist ein Textbereich eingerichtet, in dem der Benutzer zusätzliche JavaScripts hinzufügen kann (eines pro Zeile). Ich habe dann etwas PHP, das jede Zeile nimmt und das Skript zum Kopf hinzufügt. Hier ist meine PHP:

$BDjs = $this->params->get('bd-addjs');
$BDjsAr = explode("\n", $BDjs);
$BDjsAr = array_filter($BDjsAr, 'trim');
foreach ($BDjsAr as $line) {
    $line = str_replace('\n','',$line);
    $doc->addScript($line);
}

Das PHP funktioniert einwandfrei, aber das gerenderte HTML enthält einen zusätzlichen Zeilenumbruch wie folgt:

<script src="/dev/script1.js
" type="text/javascript"></script>
  <script src="/dev/script2.js" type="text/javascript"></script>

Meine Frage ist, wie ich den Zeilenumbruch nach "script1.js" loswird.

2
DesignSubway

Ich habe das herausgefunden, indem ich stattdessen preg_replace verwendet habe.

Mein endgültiger Code lautet:

$BDjs = $this->params->get('bd-addjs');
$BDjsAr = explode("\n", $BDjs);
$BDjsAr = array_filter($BDjsAr, 'trim');
foreach ($BDjsAr as $line) {
    $line = preg_replace("/[\n\r]/","",$line);
    $doc->addScript($line);
}
1
DesignSubway

ihr array_filter($BDjsAr, 'trim'); ist nutzlos ...

da Sie bereits foreach verwenden, tun Sie einfach Folgendes:

$BDjs = $this->params->get('bd-addjs');
$BDjsAr = explode("\n", $BDjs);
foreach ($BDjsAr as $line) {
    $doc->addScript(trim($line));
}
1
Fedik

Folgendes verstehe ich über Ihre Frage:

  • Sie vertrauen den Daten von: $this->params->get('bd-addjs');
  • Sie erwarten eine einzelne Zeichenfolge von Javascript-Dateinamen, die durch Zeilenumbrüche und möglicherweise durch Leerzeichen getrennt sind.
  • Sie möchten jeden Dateinamen anhand der Zeilenumbrüche isolieren und die Dateien einzeln über addScript() einbinden, nachdem Sie das unnötige Leerzeichen aus jedem Dateinamen entfernt haben.

Ihre gepostete Lösung scheint ein bisschen indirekt zu sein, weil Sie explodieren und dann preg_replace() n Mal aufrufen.

Schlimmer noch, Ihr array_filter() -Schritt ist einfach falsch und hat keine Auswirkung auf Ihre Saiten. Hier ist der Beweis .

Ich empfehle Ihnen, " jeden Vogel mit einer Klappe zu schlagen ". Sie können die Dateinamen isolieren, die Leerzeichen ([\s\t\r\n]) Kürzen und eine Validierungsebene wie die folgende hinzufügen:

Vorführung :

$test = "javascript1.js
 /dev/spacethenjs2.js

    doublenewline_tab_javascript3.js
/dev/javascript4.js
javascript5_trailingspaces.js    ";
var_export($test);
echo "\n---\nSee divided and trimmed output: ";
var_export(preg_match_all("~[/\w]+\.js\b~", $test, $matches) ? $matches[0] : 'no matches');

Ausgabe:

'javascript1.js
 /dev/spacethenjs2.js

    doublenewline_tab_javascript3.js
/dev/javascript4.js
javascript5_trailingspaces.js    '
---
See divided and trimmed output: array (
  0 => 'javascript1.js',
  1 => '/dev/spacethenjs2.js',
  2 => 'doublenewline_tab_javascript3.js',
  3 => '/dev/javascript4.js',
  4 => 'javascript5_trailingspaces.js',
)

Versuchen Sie dieses Snippet, um die obige Logik auf Ihr Projekt anzuwenden:

if (preg_match_all("~[/\w]+\.js\b~", $BDjs, $matches)) {
    foreach ($matches[0] as $filename) {   // [0] contains all of the "fullstring" matches
        $doc->addScript($filename);
    }
}

Wenn Sie nicht folgen, was mein Regex-Muster tut, können Sie diese Regex101-Demonstration mit Erklärung sehen.

Wenn Ihre Dateinamen stärker variieren als meine Beispiele - zum Beispiel, wenn Sie Javascript-Dateinamen haben, an die ein Querystring wie file.js?key=af32d12c94 Angehängt ist, können Sie das Muster anpassen, um eine solche Varianz spezifisch zu behandeln (~[/\w]+\.js(?:\?key=\w+)?\b oder das Muster wirklich lockern (~\S+\.js\S*).

Es gibt buchstäblich Hunderte von Mustern, die aus verschiedenen Gründen erstellt werden können. Sie können einige Ihrer bekannten Dateinamen in das Eingabefeld von regex101 schreiben und mit verschiedenen Mustern experimentieren, um herauszufinden, welche für Ihr Projekt am besten geeignet sind.

Wenn Sie sich keine Gedanken über die Validierung machen, können Sie natürlich diese Alternative verwenden:

foreach (preg_split("~\s+~", $test, -1, PREG_SPLIT_NO_EMPTY) as $filename) {
    $doc->addScript($filename);
}

Wenn diese Textfolge von Benutzern stammt, haben Sie ALLE GRÜNDE, UM SIE INNERHALB IHRES LEBENS ZU VALIDIEREN/SANITIEREN !!!

0
mickmackusa