PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   regulärer Ausdruck (http://www.selfphp.de/forum/showthread.php?t=10167)

feuervogel 04.04.2005 14:11:36

regulärer Ausdruck
 
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:
PHP-Code:

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 14:19:55

AW: regulärer Ausdruck
 
Bin mir net sicher. probier mal (.+?)

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

feuervogel 04.04.2005 14:21:28

AW: regulärer Ausdruck
 
mach ich nachher mal,

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

hat auch nix gebracht...

|Coding 04.04.2005 14:47:15

AW: regulärer Ausdruck
 
Schau mal, so läuft es:

PHP-Code:

<?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 17:58:32

AW: regulärer Ausdruck
 
okay, ich werde mal schauen. allerdings hat dein pattern

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

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

feuervogel 04.04.2005 18:29:18

AW: regulärer Ausdruck
 
geschafft!

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

PHP-Code:

$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 18:54:19

AW: regulärer Ausdruck
 
Ja ganz wie Du es wolltest :-)
Zitat:

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


|Coding 04.04.2005 19:39:46

AW: regulärer Ausdruck
 
Ach, und wenn Du [[bla]blub] oder [[bla]] matchen willst, dann halt so (und zwar ohne Arrays):
PHP-Code:

<?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 22:20:24

AW: regulärer Ausdruck
 
Zitat:

Zitat von |Coding
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 22:50:31

AW: regulärer Ausdruck
 
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 :-)


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:21:13 Uhr.

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