Help: regex

Marius '95

troubleShooter
Se da textul:

ABCD
EFGH

Am nevoie de un regex compatibil PHP care sa imi gaseasca
CD
EF
dar nu si
CD EF

Cum fac?
Mentionez ca linia noua este de tip <CR><LF>.

Am incercat:
~CD.EF~s = imi gaseste si "CD EF", cu spatiu in loc de linie noua
~CD$EF~m = nu trece mai departe de $
~CD$^EF~m = nu trece mai departe de $
~CD^EF~m = esec total, se opreste dupa D

Help!

PS:
~CD$.EF~ms = Merge! WTF?! Sa imi explice si mie cineva de ce merge si ce caracter imi gaseste acolo punctul.
 
Ideea e că $ și ^ nu mănâncă din caractere, doar poziționează (de-aia le zice ancore). La tine se oprește la $ corect, dar nu face match pe următorul caracter - tu te aștepți ca următorul caracter după $ să fie E, dar pentru că $ nu mănâncă din caractere, următorul caracter e de fapt \r (pe care nu îl pui în pattern => nu face match).

CD$\r\nEF e echivalent cu CD\r\nEF în acest caz.
 
Da, ma asteptam ca $ si ^ sa corespunda unui caracter. Abia acum am inteles de ce nu mergea. Multumesc.
 
Help! iar...
Am nevoie de un regex care sa gaseasca textul din ultima celula a unui tabel HTML de pe fiecare rand. Mentionez ca \r\n sunt puse aiurea prin HTML.

Am incercat
~<td>.*?</td>[^<]*?</tr>~gms
dar <td> imi gaseste prima celula, degeaba pun ? dupa .*, ca acel ? are efect doar asupra </td> care urmeaza.
 
Vezi lookaround. Mai jos exemplu cu negative lookahead (da, se poate și mai frumos, dar asta este)
Code:
<td>(?:.(?!>))*</td>(?:.(?!>))*</tr>

Te mai joci și tu cu ele.

De fapt se poate și mai simplu

Code:
<td>[^<]*<\/td>[^<]*<\/tr>
 
Last edited:
Nu merge cu [^<]. Incercasem eu deja. Continutul celulei poate avea diverse tag-uri, gen <p>, <div>.
Si nu merge nici (?!>) din acelasi motiv.

OK, deci randurile din tabel arata asa:
Code:
<tr><td>
                <p>
                  <strong>Operating System</strong>
                </p>
              </td><td>
                <p>
                  <strong>Maximum Security Impact</strong>
                </p>
              </td><td>
                <p>
                  <strong>Aggregate Severity Rating</strong>
                </p>
              </td><td>
                <p>
                  <strong>Updates Replaced*</strong>
                </p>
              </td></tr>
            <tr><td colspan="4">
                <p>
                  <strong>Windows Server 2003</strong>
                </p>
              </td></tr>
            <tr><td>
                <p>
                  <a href="https://www.microsoft.com/downloads/details.aspx?familyid=F2B9D541-9BE0-4E81-A948-48F810E1A863">Windows Server 2003 Service Pack 2</a> <br />(3067505)</p>
              </td><td>
                <p>Elevation of Privilege</p>
              </td><td>
                <p>Important</p>
              </td><td>
                <p>3061518 in <a href="http://go.microsoft.com/fwlink/?LinkId=536690">MS15-055</a> </p>
              </td></tr>
            <tr><td>
                <p>
                  <a href="https://www.microsoft.com/downloads/details.aspx?familyid=92AFF2B2-7D6E-4D29-BC2E-111F08BEFDAA">Windows Server 2003 x64 Edition Service Pack 2</a> <br />(3067505)</p>
              </td><td>
                <p>Elevation of Privilege</p>
              </td><td>
                <p>Important</p>
              </td><td>
                <p>3061518 in <a href="http://go.microsoft.com/fwlink/?LinkId=536690">MS15-055</a> </p>
              </td></tr>
Va rog, nu radeti! :tongue:
Imi trebuie ultima celula, aia cu MS15-055.
 
Regex in Total Commander:
Cum fac sa corectez un string care contine ora din GMT in ora locala (GMT+3)? Adica sa adaug 3 ore la cifrele alea?
 
Marius, o solutie "intortocheata" (dar pe care am mai aplicat-o cu succes) e sa faci un "dir /b >> fisier.txt" dupa care importi fisierul txt in Excel, intr-o alta coloana prelucrezi cum vrei sa arate noile nume si exporti totul intr-un fisier *.bat cu comenzi de genul "ren <nume coloana1> <nume coloana2>"
 
Last edited:
Se da string-ul:
xxx 123 456 789 xxx
Cum fac sa obtin toate grupurile de cifre, dar fara sa repet \d{3} de 3 ori?
Am incercat:
xxx(?:\s(\d{3}))+\sxxx
dar scoate doar ultimul grup.
 
Da, dar trebuie sa verific inceputul si sfarsitul randului (acele xxx-uri), ca sunt si randuri care nu ma intereseaza. Nu le-am scris degeaba.
 
Back
Top