php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Scripts > Apps und PHP Script Gesuche
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


Apps und PHP Script Gesuche Hier könnt ihr nach PHP Skripten und Programmen fragen. Postet eure Wünsche

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 29-11-2008, 20:27
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard Pekka sucht Regex!

In Reguläre Ausdrücke komme ich trotz aller Versuche nicht ordentlich rein. Hat jemand, der sie im Schlaf beherrscht, Lust, mir folgende Aufgabenstellung in einen Regex zu gießen? Wäre sehr dankbar.

Finde aus einem String das erste Vorkommen eines Blocks, der mit

/**

beginnt und mit

*/

endet (ein phpDocumentor-Docblock).
Schneide daraus heraus alles zwischen der Zeichenkette "@desc" und dem nächsten Vorkommen von "@".

Also verbildlicht:

Code:
 /**
  * @desc Dies ist der Teil, den ich per Regex rausschneiden will
  *             und dies
  *             und dies
  * @author dies nicht mehr.
  * @copyright und dies auch nicht.
 */

 /**
  * @desc und dies auch nicht, weil es im zweiten Docblock ist. 
  */
Mit Zitat antworten
  #2 (permalink)  
Alt 29-11-2008, 20:55
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hm, das, was im DocBlock steht, zu matchen ist nicht weiter schwierig:
Code:
/\*.*?@desc([^@]+).*?\*/
(auch wenn der Ausdruck sicherlich keinen Preis gewinnen würde).

Ich habe gerade leider keine Zeit, mit Lookaround zu hantieren, aber vielleicht komme ich morgen oder die Tage dazu. Alternativ könntest du natürlich auch außerhalb des Regulären Ausdrucks ermitteln, ob es sich um das erste Vorkommen eines DocBlock handelt.


Grüße

Geändert von Griecherus (29-11-2008 um 20:57 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 29-11-2008, 21:05
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Das ist schon ein guter Ansatz, vielen Dank!
Jetzt müßte er nur noch entweder beim nächsten @ oder beim nächsten */ (Ende des DocBlock) mit dem Treffer aufhören, dann wäre ich bedient. (Sonst nimmt er noch Teile des nächsten docBlock mit, oder die ganze Datei, wenn es kein @ mehr gibt). Ich probiere auch mal ob ich das hinkriege
Mit Zitat antworten
  #4 (permalink)  
Alt 29-11-2008, 21:07
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Bei mir tut es das auch brav
Code:
Array
(
    [0] => /**
  * @desc Dies ist der Teil, den ich per Regex rausschneiden will
  *             und dies
  *             und dies
  * @author dies nicht mehr.
  * @copyright und dies auch nicht.
 */
    [1] =>  Dies ist der Teil, den ich per Regex rausschneiden will
  *             und dies
  *             und dies
  * 
)
Link zum RegExp-Evaluator

EDIT:
Gut, ich sehe das Problem... Ich schaue mal, ob sich noch etwas zaubern lässt.

Geändert von Griecherus (29-11-2008 um 21:16 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 29-11-2008, 21:17
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Nein, wenn @desc der letzte @-Wert im Block ist, nimmt er den nächsten Block mit:

Link
Mit Zitat antworten
  #6 (permalink)  
Alt 29-11-2008, 23:14
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Was hälst du denn davon, den ersten Docblock aus einer Datei rauszufischen, bevor du die Regex drüberlaufen lässt? So ala
PHP-Code:
$contents file_get_contents($file_name);

$docblock_opening strpos($contents'/*');
$docblock_closing strpos($contents'*/');

if (
$docblock_opening === false ||
    
$docblock_closing === false)
{
    
// ...
}

$block substr($contents$docblock_opening$docblock_closing $docblock_opening); 
. Das in die Regex zu integrieren wird nämlich nicht trivial, befürchte ich (was nicht heisst, dass ich es nicht weiterhin versuche )


Grüße
Mit Zitat antworten
  #7 (permalink)  
Alt 29-11-2008, 23:38
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Code:
#(?<!/\*\*)[^/\*\*]*/\*\*.*?@desc([^@]+).*?\*/#s
Es ließe sich noch so einiges optimieren, aber sollte zumindest schonmal funktionieren

Als Dankeschön lasse ich mich gerne auf ein Bier einladen, solltest du irgendwann mal in Berlin sein

Teste mich

Geändert von Griecherus (30-11-2008 um 00:11 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 30-11-2008, 01:14
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Ich will auch nochmal kurz meinen Senf dazu geben. Konnte das jetzt nicht akzeptieren, dass es da noch nichts gibt und habe was eigenes geschrieben ^^
Klickst du.
Mit Zitat antworten
  #9 (permalink)  
Alt 30-11-2008, 01:19
Blackgreetz
 PHP Junior
Links : Onlinestatus : Blackgreetz ist offline
Registriert seit: Oct 2005
Beiträge: 901
Blackgreetz ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Reicht

Code:
#/\*\*.*?@desc([^@|\*/]+)#s
Nicht auch aus?

mfg
Mit Zitat antworten
  #10 (permalink)  
Alt 30-11-2008, 02:13
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Blackgreetz
Reicht

Code:
#/\*\*.*?@desc([^@|\*/]+)#s
Nicht auch aus?

mfg
OffTopic:

Wollt ihr mir etwa mein Bier streitig machen?

Mit Zitat antworten
  #11 (permalink)  
Alt 30-11-2008, 08:10
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Eyyy, coole Sache!
@Griecherus: Das Bier ist dir auf jeden Fall sicher!
Vielen Dank! Ich werde heute mal die beste Lösung einbauen.
Mit Zitat antworten
  #12 (permalink)  
Alt 30-11-2008, 12:24
Blackgreetz
 PHP Junior
Links : Onlinestatus : Blackgreetz ist offline
Registriert seit: Oct 2005
Beiträge: 901
Blackgreetz ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Griecherus
OffTopic:

Wollt ihr mir etwa mein Bier streitig machen?

OffTopic:
Damit du nicht leer ausgehst:
Mit Zitat antworten
  #13 (permalink)  
Alt 30-11-2008, 13:25
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Zum Thema passend: PHP-Desaster hat einen kleinen Docblock-Parser geschrieben, der haargenau zu diesem Thema paßt und die Ergebnisse des Regex übernehmen kann:
http://php-resource.de/forum/showthr...threadid=94673
Mit Zitat antworten
  #14 (permalink)  
Alt 01-12-2008, 15:54
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Falls es noch eine Rolle spielen sollte: Hier die Regex nochmal etwas entschlackt:
Code:
~(?<!/\*\*)/\*\*.*?@desc([^@]+|\*/)~s
@Blackgreetz: Dein Muster ist nicht gierig genug
Zitat:
* und dies
* und dies
wird nicht gematcht.

EDIT:

Update



Grüße

Geändert von Griecherus (01-12-2008 um 18:01 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 01-12-2008, 19:40
phpguru42
 Newbie
Links : Onlinestatus : phpguru42 ist offline
Registriert seit: Oct 2008
Beiträge: 71
phpguru42 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Vielleicht noch eine Lösung ohne Reguläre Ausdrücke, um die Doc-Comments rauszufischen:

PHP-Code:
function getDocComments($source)
{
    
$doc_comments = array();
    
    foreach(
token_get_all($source) as $token)
    {
        if(
is_array($token) && $token[0] == T_DOC_COMMENT)
        {
            
$doc_comments[] = $token[1];
        }
    }
    
    return 
$doc_comments;

Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:57 Uhr.