Laden...

PHP-Kommentare per RegEx matchen

Erstellt von IP-Sh0k vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.385 Views
I
IP-Sh0k Themenstarter:in
11 Beiträge seit 2009
vor 14 Jahren
PHP-Kommentare per RegEx matchen

Hallo.
Ich bin gerade dabei nen PHP-Syntax-Highlighter zu schreiben.

Bisher klappt auch alles wunderbar, nur jetzt habe ich ein paar Probleme bei den Comments.

Ich habe 2 RegEx die noch nicth so richtig wollen:
/(.?)/ <- klappt nicht aber ich weiß nicht warum
//(.
?)\n <- klappt auch i-wie nicht ... ebenfalls keine ahnung

edit: //(.*?)[\n] <-- so funktionierts.. also fehlt mir nurnoch das erste

Ich hoffe ihr könnt mir helfen

Vielen Dank im Voraus

Ich kann alles, außer das was ich brauche 😁

2.760 Beiträge seit 2006
vor 14 Jahren

Wär auch gut wenn du noch schreiben würdest was du matchen willst. Denn ein "funktioniert nicht" ohne Beispiel lässt doch sehr viel interpretationsspielraum.
\d ≤ funktioniert beispielsweise wunderbar.

I
IP-Sh0k Themenstarter:in
11 Beiträge seit 2009
vor 14 Jahren

string Text = "<?php /quotation/ ?>";

RegEx RX = new RegEx("/(.?)*/");

Match m = RX.Match(Text);

so .. reicht das beispiel?

Ich kann alles, außer das was ich brauche 😁

2.760 Beiträge seit 2006
vor 14 Jahren

Noch nicht ganz. Da ja noch nicht klar ist was du matchen möchtest.
Das Kommetar als ganzes?
Den Text des Kommentars?
Die PHP-Tags?

I
IP-Sh0k Themenstarter:in
11 Beiträge seit 2009
vor 14 Jahren

ich möchte halt alles was zwischen /* / steht haben + die / */ tags

<?php /quotation/ ?>
soll dann
/quotation/
per regex ausgeben 😉

Ich kann alles, außer das was ich brauche 😁

2.760 Beiträge seit 2006
vor 14 Jahren
I
IP-Sh0k Themenstarter:in
11 Beiträge seit 2009
vor 14 Jahren

jetzt schreib er mir: Nicht erkannte Escapesequenz
???

an sich hab ich mir das auch schon gedacht, dass das von dir richtig ist

Ich kann alles, außer das was ich brauche 😁

R
295 Beiträge seit 2008
vor 14 Jahren

Probier mal \ anstatt .

ServiceStack & Angular = =)

I
IP-Sh0k Themenstarter:in
11 Beiträge seit 2009
vor 14 Jahren

danke klappt jetzt perfekt

"(/\(.)\*/)" <-- ideal

danke nochmal

Ich kann alles, außer das was ich brauche 😁

2.760 Beiträge seit 2006
vor 14 Jahren

Noch als kurze Anmerkung:
\ ist nur wegen C# nötig (nur in string-literalen) alternativ kannst du ein @ benutzen:
@".(/*(.)*/).*"

I
IP-Sh0k Themenstarter:in
11 Beiträge seit 2009
vor 14 Jahren

hab noch ne ergänzungsfrage.. was ist wenn ein \n \r \t oder sonstiges für eine neue zeile dazwischensteht?

<?php
/hier ist
ein komment
/
...code
?>

wie muss dann die regex: "(/\(.)\*/)"
angepasst werden, damit das auch zeilenübergreifend funktioniert?

Ich kann alles, außer das was ich brauche 😁

2.760 Beiträge seit 2006
vor 14 Jahren

Das kannst du mit den Entsprechenden RegexOptions machen

R
234 Beiträge seit 2007
vor 14 Jahren

Gib deinem RegEx mal sowas:

<?php
echo "/* ich bin in einem string";
/* blablubb /* */
?>

Ich habs jetzt nicht ausprobiert, aber es dürfte valides PHP sein und ich denke er beißt sich daran die Zähne aus (bzw. matched zu viel).

Um Spachen zu parsen ist es meistens sinnvoller eine Parser zu schreiben, da kann man sich selten auf RegEx verlassen. Hatten wir auch schon mehrmals das Thema, falls ich mich nicht täusche.

/Edit: Code-Tag hinzugefügt.

I
IP-Sh0k Themenstarter:in
11 Beiträge seit 2009
vor 14 Jahren

Tut mir leid, dass ich dich enttäuschen muss, aber es wird richtig gematcht 😉

PS: mit multiline, das hab ich noch nciht hinbekommen.
Ich denke das ist besser, wenn ich das in der RegEx mit löse...

Also nochmal wie kann ich die RegEx: "(/\(.?)\*/)" mit \n\r\t benutzen...
ich überlege auch schon fleißig 😄

Ich kann alles, außer das was ich brauche 😁

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo IP-Sh0k,

mit multiline, das hab ich noch nciht hinbekommen.

Multiline wirkt auf ^ und $. Du musst Singleline verwenden. Das wirkt auf .

Ich denke das ist besser, wenn ich das in der RegEx mit löse...

Nö, nicht unbedingt.

herbivore

R
234 Beiträge seit 2007
vor 14 Jahren

Tut mir leid, dass ich dich enttäuschen muss, aber es wird richtig gematcht 😉

Da du kein Multiline hast, ja. Dann nehmen wir halt den Zeilenumbruch aus meinem "Script":

<?php
echo "/* ich bin in einem string"; /* blablubb /* */
?>

... schon macht dein RegEx nicht mehr mit.

(Natürlich ist es fraglich ob man solchen Code tatsächlich irgendwo findet, ich will damit nur zeigen, dass ein RegEx nicht unbedingt der sicherste Weg ist um dein Problem zu lösen.)