SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Einführung in XHTML, CSS und Webdesign

Einführung in XHTML, CSS und Webdesign zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten
Hilfe Community Kalender Heutige Beiträge Suchen

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 07.03.2009, 17:53:21
mgutt mgutt ist offline
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)
Mit Zitat antworten
  #2  
Alt 08.03.2009, 08:27:22
Benutzerbild von agent47
agent47 agent47 ist offline
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)
Mit Zitat antworten
  #3  
Alt 08.03.2009, 13:46:54
mgutt mgutt ist offline
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
Mit Zitat antworten
  #4  
Alt 08.03.2009, 13:58:07
Benutzerbild von agent47
agent47 agent47 ist offline
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
Mit Zitat antworten
  #5  
Alt 08.03.2009, 16:11:20
mgutt mgutt ist offline
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)
Mit Zitat antworten
  #6  
Alt 08.03.2009, 16:54:42
Benutzerbild von agent47
agent47 agent47 ist offline
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
Mit Zitat antworten
  #7  
Alt 08.03.2009, 17:21:57
mgutt mgutt ist offline
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)
Mit Zitat antworten
  #8  
Alt 08.03.2009, 18:59:18
Benutzerbild von agent47
agent47 agent47 ist offline
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
Mit Zitat antworten
  #9  
Alt 08.03.2009, 19:26:54
mgutt mgutt ist offline
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
$runs200000;
$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)
Mit Zitat antworten
  #10  
Alt 08.03.2009, 22:48:52
Benutzerbild von agent47
agent47 agent47 ist offline
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
Mit Zitat antworten
Antwort


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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Berechnung in einfacher Bedingung ( ) ? bitshock PHP Grundlagen 1 20.12.2007 02:34:24
regex, geht aufem localhost, aber nicht online JuliusCaesar PHP Grundlagen 14 14.12.2007 10:05:36
Link entfernen, wenn Bedingung erfüllt dgg PHP Grundlagen 4 13.09.2006 13:23:19
regex Problem morsche PHP für Fortgeschrittene und Experten 10 19.01.2005 15:29:41
regex problem - und/nicht |Coding PHP für Fortgeschrittene und Experten 2 01.08.2003 14:03:59


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:09:28 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt