PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : regulärer Ausdruck


feuervogel
04.04.2005, 15:11:36
Hallo!

Ich habe ein Problem mit einem regex:

"%[[(.+)](.+)]%Use" => 'make_a_link( "$1" , "$2" )' (funktion siehe weiter unten)

Aus

[bla[blubb]] soll <a href="bla">blubb</a> werden

alles prima sonderklasse, wenn sonst nix mehr in der richtung danach kommt.

steht da

[bla[blubb]]

[[blo]] (was dannzu <a href="blo">blo</a> werden soll)

steht im quältext:

<a href="bla%5Dblubb%5D%0A%0A%5B%5Bblo">bla]blubb]<br />
<br />
[[blo</a><br />
</p><br />
<a href="index.php?prgm=wiki&mode=edit">edit</a> <a href="index.php?prgm=wiki&mode=lock">lock</a><br /></div>

es wird also nicht ungreedy gemachted, obwohl ich ja extra dafür U angegeben habe.

make_a_link sieht so aus:
function make_a_link( $one , $two = '' ) {

if( empty( $two ) )
return "<a href="" . rawurlencode( html_entity_decode( $one ) ) . "">$one</a>";
else
return "<a href="" . rawurlencode( html_entity_decode( $one ) ) . "">$two</a>";

}

wo liegt mein denkfehler?

Small-Talk
04.04.2005, 15:19:55
Bin mir net sicher. probier mal (.+?)

und du filterst bei "[bla[blubb]]" das bla nicht raus

feuervogel
04.04.2005, 15:21:28
mach ich nachher mal,

"%[[(.+)]([^]]+)]%Use"

hat auch nix gebracht...

|Coding
04.04.2005, 15:47:15
Schau mal, so läuft es:

<?php
$str = '[bla[blubb]]

[[blo]]';

echo preg_replace_callback('%[(.*)[(.+)]]%Us', 'make_a_link', $str);

function make_a_link($matches){
if(empty($matches[1]))
return '<a href="' . rawurlencode(html_entity_decode($matches[2])) . '">' . $matches[2] . '</a>';
else
return '<a href="' . rawurlencode(html_entity_decode($matches[1])) . '">' . $matches[2] . '</a>';
}
?>

feuervogel
04.04.2005, 18:58:32
okay, ich werde mal schauen. allerdings hat dein pattern

%[(.*)[(.+)]]%Us

einen kleinen schöhnheitsfehler, deins matched auf [bla[blubb]]

feuervogel
04.04.2005, 19:29:18
geschafft!

ich habe einfach mal die reihenfolge der pattern geändert :-)

$regex = array( "%[[(.+)](.+)]%Use" , "%[[(.+)]]%Use" );
$replace = array( 'make_a_link( "$1" , "$2" )' , 'make_a_link( "$1" )' );

$string = preg_replace( $regex , $replace , $string );

|Coding
04.04.2005, 19:54:19
Ja ganz wie Du es wolltest :-)
[bla[blubb]] soll <a href="bla">blubb</a> werden

|Coding
04.04.2005, 20:39:46
Ach, und wenn Du [[bla]blub] oder [[bla]] matchen willst, dann halt so (und zwar ohne Arrays):

<?php
$str = '[bla[blubb]]

[[blo]]';

echo preg_replace_callback('%[[(.+)](.*)]%Us', 'make_a_link', $str);

function make_a_link($matches){
if(empty($matches[2]))
return '<a href="' . rawurlencode(html_entity_decode($matches[1])) . '">' . $matches[1] . '</a>';
else
return '<a href="' . rawurlencode(html_entity_decode($matches[1])) . '">' . $matches[2] . '</a>';
}
?>

Ausserdem ist meine Methode schneller (bei größeren Datenmengen ca. doppelt so schnell). :-)

feuervogel
04.04.2005, 23:20:24
Ausserdem ist meine Methode schneller (bei größeren Datenmengen ca. doppelt so schnell). :-)
wie misst du sowas?

ich werds jetzt erst mal so machen, wird dann eh open-source (wie bei php so üblich), dann darfst dus auch gerne verbesser :-)

|Coding
04.04.2005, 23:50:31
Hi Julian.

Ich meine das so:

Wenn Du der Funktion preg_replace() als Input "[[foo]bar]" übergibst, dann fällt da kein Geschwindigkeitsunterschied auf. Doch wenn Du der Funktion jetzt z.B. 1 KB Daten als Input übergibst, dann wäre meine Variante ca. ein drittel schneller.

Benchmark:

------ Einstellungen ------
dfgsdfgsdfgsdf [[blubb]bla] ncvbnnnnnhgfffffffffddddddd dj fjtzj tz jtdzj tdz jtz jtz [[blubb]]dtzj dtzjdtzjd tzjfdtzjdtz [[blubb]]rtzhd rthdtrz drhdrt r drt[[blubb]]zuztutumtrzumtrzu ztr utrzu rztu rtzuztru467 4z56i6 rk il ioö-io zk t srths[[blubb]]jhh [[blubb]] hjjh[[blubb]]tzz trz i67u 46 z34z 46z trh z rm[[blubb]bla] ncvbnnnnnhgfffffffffddddddd dj fjtzj tz jtdzj tdz jtz jtz [[blubb]]dtzj dtzjddtzjdtz [[blubb]]rtzhd rthdtrz drhdrt r drt[[blubb]]zuztutumtrzumtrzu ztr utrzu rztu rtzuztru467 4z56i6 rk il ioö-io zk t srths[[blubb]] [[blubb]] [[blubb]]tzz trz i67u 46 z34z 46z trh z rm[[blubb]bla] ncvbnnnnnhgfffffffffddddddd dj fjtzj tz jtdzj tdz jtz jtz [[blubb]]dtzj dtzjdtzjd tzjfdtzjdtz [[blubb]]rtzhd rthdtrz drhdrt r drt[[blubb]]zuztutumtrzumtöärzu ztr utrzu rztu rtzuztru467 4z56i6 rk il ioö-io zk t srths[[blubb]] löl[[blubb]]kökl [[blubb]]tzz trz i67u 46 z34z 46z trh z rm[[blubb]bla] ncvbnnnnnhgfffffffffddddddd dj fjtzj tz jtdzj tdz jtz jtz [[blubb]]dtzj dtzjdtzjd tzjfdtzjdtz [[blubb]]rtzhd rthdtrz drhdrt r

Datenlänge: 1024 Byte
Replacements: 24
---------------------------
Deine Variante: ~78 ms
Meine Variante: ~60 ms
---------------------------
System:

- Win32
- PHP 4.3.11
- Apache 2.0.52
- PII @ 450MHz
---------------------------

Nicht nur das Deine Variante langsamer ist, Nein, es kommt auch nicht wirklich das gewünschte raus. Bei meiner schon und schneller ist sie auch :-)

feuervogel
05.04.2005, 01:31:20
hmmm...na gut, meine methode hat noch fehler. jetzt habe ich sie mal bereinigt:

$regex = array( "%[[([^]]+)]([^]]+)]%Use" , "%[[([^]]+)]]%Use" );
$replace = array( 'make_a_link( "$1" , "$2" )' , 'make_a_link( "$1" )' );

$string = preg_replace( $regex , $replace , $string );


ich werde das ganze eventuell mal auf meinem server testen (wenn er dann mal gescheit läuft), mit ab, falls dir das was sagt.

p.s.: und nen server auf ner windose laufen zu lassen, ist halt auch einfach ar$c4 lahm *g*

|Coding
05.04.2005, 01:47:00
ich werde das ganze eventuell mal auf meinem server testen (wenn er dann mal gescheit läuft), mit ab, falls dir das was sagt.
"ab" steht für...?

p.s.: und nen server auf ner windose laufen zu lassen, ist halt auch einfach ar$c4 lahm *g*
Richtisch! Der dient aber nur als Localhorst, auf dem ich meine Scripte entwickel und wenn sie hier normal laufen (bezgl. Geschwindigkeit), dann rennen die Online erst recht. Dieser muss halt keiner Belastung standhalten, somit ist das schon OK :-) Einer Produktivmaschine würde ich auch kein Windows verpassen :-)

feuervogel
05.04.2005, 07:57:36
"ab" steht für...?

apache benchmark. ist unter linux zumindest bei den apache-tools dabei, damit kann man seitenanfragen an den apache schicken und so die performance testen.

Richtisch! Der dient aber nur als Localhorst, auf dem ich meine Scripte entwickel und wenn sie hier normal laufen (bezgl. Geschwindigkeit), dann rennen die Online erst recht. Dieser muss halt keiner Belastung standhalten, somit ist das schon OK :-) Einer Produktivmaschine würde ich auch kein Windows verpassen :-)
dann verpass doch deinem localhorst auch kein windows?

|Coding
05.04.2005, 14:31:17
Guten Morgen,

*streck* *kratz* *streck*

Ich habe die Kiste doch nur als Localhorst laufen, da mache ich mir doch nicht die arbeit mit Linux, zu mal mein Wissen zu Linux "naja" ist.