Wyszukanie tekstu po znaczniku za pomocą wyrażeń regularnych

0

Problem dotyczy parsowania komentarzy a przedstawia się następująco:
Mam fragment tekstu składający się z kilku linijek. Potrzebuję w nim wyszukać fragment od określonego klucza do końca linii. Czyli przykładowo mając:

 
/**
* to jest jakiś komentarz
* linia poniżej jest istotna
* klucz: @restrict role="admin"
* dalszy ciąg komentarza
*/

W powyższym przykładzie interesuje mnie, aby podając klucz @restrict otrzymać w wyniku tylko tekst:
role="admin"
Podobno najprościej jest to zrobić używając wyrażeń regularnych, ale w tym właśnie mam problem. Inne podejście polegające na podziale na linie i szukaniu słowa kluczowego wydaje mi się zbyt złożone, (co prawda łatwiejsze). Czy ktoś mógłby mi pomóc i doradzić jak to zrobić?

1

W swoim życiu w php napisałem tylko prosty formularz na własne potrzeby, ale jeśli znam podstawy wyrażen regularnych to powinno zadziałać po prostu @restrict (.+?)$. Próbowałeś tak? Zaś to, co chcesz żeby zwróciło będzie w jakimś $1 czy tam ObiektRegExpr.Match[1] lub czymś podobnym.

0

Mam taki pattern:
$pattern = "/\\@restrict(.*)\n/";
Zwraca mi:
@restrict role="admin"
i do tego koniec linii.
Chciałbym mieć tylko role="admin" i to jest główny problem, żeby to zwrócić bez ograniczników, czyli praktycznie tylko to, co pasuje do (.*) . Da się tak w ogóle, czy muszę teraz z tego otrzymanego wycinać to co konkretnie chcę?

dodanie znaczników <code> - fp

2
<?php
$tekst = '/**
* to jest jakiś komentarz
* linia poniżej jest istotna
* klucz: @restrict role="admin"
* dalszy ciąg komentarza
*/';


if (preg_match("/\x40restrict (.*)./", $tekst, $wynik)) {
  echo('ZWRÓCIŁO ' . $wynik[1] . $wynik[1]); //zwraca ZWRÓCIŁO role="admin"role="admin" więc raczej nie ma znaku końca wiersza
}
else {
  echo('NIE DZIAŁA!!!');
}
?>
0

(.*)./ - a czemu tu jest jeszcze ta kropka przed ukośnikiem? Dokumentacja mówi, że rzeczywiście znak nowej linii nie powinien być włączony w wynik. Jednakowoż robiąc taki test jak wyżej ten znak tam mam. Może mam komputer jakiś popsuty... Nie mniej jednak wynik i tak potraktuję funkcją trim, bo tam zapewne będzie spacja albo jakiś tabulator, więc nową linię też mi wytnie. Problem właściwie uznaję za rozwiązany, ale nie do końca wyjaśniony. Dzięki za pomoc.

1

Oj, bo tam tak naprawdę nie ma znaku nowej linii tylko znak powrotu karetki 0x0D (dla wyrażeń regularnych zapis \x0D). Równie dobrze można by napisać /@restrict (.*)\r/ lub /\x40restrict (.*)\x0D/(to to samo zależy jaki zapis ktoś preferuje) . Kropka czyli dowolny znak (oprócz nowej linii) "wypełniła" to miejsce na znak powrotu karetki, który był brany pod uwagę bez niej. Mam nadzieje że teraz wszystko jasne.

0

No tak, zapomniałem, że jest \r. Teraz jestem w stanie to sobie wytłumaczyć. Ostatecznie na wyniku użyję json_decode, więc może te białe znaki nie będą wcale przeszkadzać. Dzięki za wyjaśnienie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1