CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken |
07.03.2009, 17:53:21
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 65
|
|
Regex Bedingung kann nicht erfüllt werden
Hallo,
ich habe die folgende Passage, die aus zwei Kann- und einer Muss-Bedingung besteht:
Code:
(([\w]+://)?|([\w\.]*?))+
Wie man sieht, möchte ich eins von diesem:
Code:
(http://|https://|ftp://|ftps://)(www.|subdomain.)
oder
(http://|https://|ftp://|ftps:/)
oder
(www.|subdomain.)
Dummerweise geht die Bedingung auch, wenn beide Kann-Bedingungen nicht zutreffen.
Ich brauche die Ergebnisse getrennt, da ich sie danach so umsetze:
Code:
<a href="http://\\2">\\1\\2</a>
Wie könnte ich das möglichst performant lösen?
Gruß
Marc
Geändert von mgutt (07.03.2009 um 17:54:45 Uhr)
|
08.03.2009, 08:27:22
|
|
Anfänger
|
|
Registriert seit: Nov 2008
Alter: 35
Beiträge: 106
|
|
AW: Regex Bedingung kann nicht erfüllt werden
trenne besser die beiden teile auf und mach die erkennung etwas genauer
PHP-Code:
$pattern = array(); $replace = array();
$pattern[] = '#(?:(https?://)(\S)*?)|(?:(ftps?://)(\S)*?)#i'; $replace[] = '<a href="$1$2">$1$2</a>';
$pattern[] = '#www\.(\S)*?#i'; $replace[] = '<a href="www.$1">www.$1</a>';
$result = preg_replace($pattern, $replace, $string);
*ungetestet*
Geändert von agent47 (08.03.2009 um 08:27:53 Uhr)
|
08.03.2009, 13:46:54
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 65
|
|
AW: Regex Bedingung kann nicht erfüllt werden
Ne dann würde ich die Anzahl der replace-Vorgänge ja verdoppeln. Ich habe jetzt schon an die 10 verschiedene. Das verstehe ich nicht unter Performance :P
|
08.03.2009, 13:58:07
|
|
Anfänger
|
|
Registriert seit: Nov 2008
Alter: 35
Beiträge: 106
|
|
AW: Regex Bedingung kann nicht erfüllt werden
reguläre ausdrücke sind schnell, und anders wirst du es nicht hinbekommen ohne eine callback funktion und die is mit sicherheit langsamer
|
08.03.2009, 16:11:20
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 65
|
|
AW: Regex Bedingung kann nicht erfüllt werden
Es gäbe ja noch die Möglichkeit so zu arbeiten (vereinfachte Darstellung):
PHP-Code:
((http://(www.))|(http://)|(www.))(REST)
Und als Übergabewert dann so:
PHP-Code:
<a href="http://$3$5$6">$3$5$6</a>
$5 sollte dann ja leer sein, wenn $3 zutrifft und ich mich jetzt nicht ganz täusche.
Meinst Du nicht, dass sowas schneller ist?
Geändert von mgutt (08.03.2009 um 16:11:34 Uhr)
|
08.03.2009, 16:54:42
|
|
Anfänger
|
|
Registriert seit: Nov 2008
Alter: 35
Beiträge: 106
|
|
AW: Regex Bedingung kann nicht erfüllt werden
das musst du einfach probieren, das is schwer zu sagen einfach mal 50 oder 100 durchläufe machen und die zeit messen
|
08.03.2009, 17:21:57
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 65
|
|
AW: Regex Bedingung kann nicht erfüllt werden
Ich glaub so ein paar Benchmarks würden nichts bringen. Da muss ich schon ein paar Millionen testen.
Ich kenne diese beiden Benchmarks:
http://benchmark.nophia.de/benchmark...tzen-b-12.html
http://benchmark.gripp.name/benchmar..._ersetzen.html
Die sind aber beide falsch. Beide machen den Fehler und setzen beim Array zusätzliche Variablen ein.
Ich mache das z.B. so:
PHP-Code:
$text = preg_replace(
array(
'regex_search1',
'regex_search2',
),
array(
'replace1',
'replace2',
), $text);
Auf die Art belastet man den Arbeitsspeicher nicht und ich bin davon überzeugt, dass man so viel schneller ist, als mit mehreren preg_replace()-Zeilen.
Aber das hilft jetzt nicht bei meiner Abfrage :P
Ich mach mal ein Benchmark und melde mich dann zurück.
Geändert von mgutt (08.03.2009 um 17:22:58 Uhr)
|
08.03.2009, 18:59:18
|
|
Anfänger
|
|
Registriert seit: Nov 2008
Alter: 35
Beiträge: 106
|
|
AW: Regex Bedingung kann nicht erfüllt werden
also ein preg_replace mit arrays gefüttert is auf jeden fall schneller als für jede regex die preg_replace funktion aufzurufen.
ne benchmarklkasse hab ich schonmal geschrieben, die kannste da downloaden -> http://wccw.in/forum.php?action=viewposts&id=76
|
08.03.2009, 19:26:54
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 65
|
|
AW: Regex Bedingung kann nicht erfüllt werden
Danke für die Klasse, aber Du hast Login-Zwang ;)
Zitat:
also ein preg_replace mit arrays gefüttert is auf jeden fall schneller als für jede regex die preg_replace funktion aufzurufen.
|
Laut den verlinkten Benchmarks ist es nicht so, daher hatte ich es erwähnt, weil ich glaube, dass das eine Falschinformation ist, die dort verbreitet wird. Es ist logisch, dass wenn man vorher zwei Arrays definiert, dass dadurch die Performance negativ beeinflusst wird. Daher sollte man nie Arrays definieren, die man nicht mehrmals benötigt.
Mein Benchmark-Script für php4 ist sehr simpel aufgebaut:
PHP-Code:
<?php
function fmicrotime() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function meineTestfunktion() {
$var = 'Test';
}
// vars
$data = isset($_GET['data']) ? $_GET['data'] : array();
$round = isset($_GET['round']) ? intval($_GET['round']) : 0;
$round++;
$loops = 100;
$pause = 100; // milliseconds
$runs= 200000;
$start = array();
$end = array();
$dif = array();
// benchmark
?>
Runde: <?= $round ?><br />
<?php
$k = 'mt';
$start[$k] = fmicrotime();
$j = (string) $data[$k];
$j = intval($data[$k]{4}) + 3;
echo($j);
for ($i=0;$i<$runs;$i++) {
meineTestfunktion();
}
$end[$k] = fmicrotime();
$dif[$k] = $end[$k] - $start[$k];
echo('Aktuell: ' . $dif[$k] . ' => ');
if (isset($data[$k]) && $data[$k]) {
$dif[$k] = $dif[$k] + floatval($data[$k]);
echo('Schnitt: ' . ($dif[$k] / $round));
}
echo('<br />');
$urldata .= 'data[' . $k . ']=' . $dif[$k] . '&';
// loops
if($round >= $loops) {
echo('Fertig.<br />');
echo('<a href=".' . $_SERVER['SCRIPT_NAME'] . '">Neustart</a>');
}
else {
?>
<script type="text/javascript">
window.setTimeout('location.replace(".<?= $_SERVER['SCRIPT_NAME'] ?>?<?= $urldata ?>round=<?= $round ?>");', <?= $pause ?>);
</script>
<?php
}
?>
Geändert von mgutt (08.03.2009 um 19:28:42 Uhr)
|
08.03.2009, 22:48:52
|
|
Anfänger
|
|
Registriert seit: Nov 2008
Alter: 35
Beiträge: 106
|
|
AW: Regex Bedingung kann nicht erfüllt werden
probier es aus, das array erstellen kann man vernachlässigen das geht so schnell da wird sich nix bemerkbar machen, aber wenn du 50x preg_replace aufrufst oder einen preg_replace mit nem array von 50 werten fütterst macht sich das schon bemerkbar
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 22:09:28 Uhr.
|