Jump to content
php.lv forumi

Regular expressions


Qued

Recommended Posts

Ņemos jau labu laiciņu, bet nevaru iebraukt, kā ar regulāro izreiksmi "nomatčot" sekojošu stringu:

jāatrod substrings, kas sākas ar (newline+"-"+space), bet beidzas pirms ((newline, kam neseko "-") vai (stringa beigām)). Substrings satur newlines. Vai kāds varētu, lūdzu, palīdzēt?

Edited by Qued
Link to comment
Share on other sites

Tu tā dīvaini saki: substrings var saturēt \n, bet arī substrings beidzas uz \n vai $. Kā lai tas zin, kurš \n ir patreiz - tas uz kā beidas, vai tas uz kas pa vidam?

Ja tavs substrings drīkst saturēt tikai tos \n, kuriem seko - (jo beigu \n nedīkst saturēt aiz sevīm -), tad labākais, kas man sanāk:

<?php
 $text = "tekst1 \n- vajadziigs teksts1 \n-turpinaajums aiz enter\n nederiigs\n- deriigs";
 if (preg_match_all("@\n- (.+)\n[^-]|\n- (.+)$@msU", $text, $m)) {
   echo "matches:\n";
   for ($i=0; $i<count($m)-1; $i++) {
     echo "---- match ----\n";
     echo ($m[1][$i]=='' ? $m[2][$i] : $m[1][$i]);
   }
 } else {
   echo 'no match';
 }
?>

Piemēra tekstam tiks nomačots "vajadziigs teksts1 \n-turpinaajums aiz enter" un "deriigs" (bez pēdiņām, protams)

Edited by bubu
Link to comment
Share on other sites

> drīkst saturēt tikai tos \n, kuriem seko -

tieši tā. Liels paldies, izteiksme atrod vajadzīgo substringu! Viena problēma tikai - es jamo lieku iekš preg_replace - šis uz \\0 paķer līdzi arī pirmo burtu no tā teksta, kas aiz beigām it kā.

Tipa, ja teksts ir

-------------------

kakis

- kakis 1;

- kakis 2;

suns

-------------------

tad paņem

-------------------

- kakis 1;

- kakis 2;

s

-------------------

Link to comment
Share on other sites

Aha. Ja ņem pirmo, tad ir labāk, bet tālākajam tekstam pirmais burts tāpat paliek norauts.

tipa tā:

---------------

kakis

{apstrādāts matčotais strings}

uns

---------------

apstrādāju apmēram tā:

$output=preg_replace("izteiksme","<div>\\1</div>",$input);

Edited by Qued
Link to comment
Share on other sites

@ - ir regex atdalītājs no t.s. modifieriem (parasti tas ir /)

msU - tieši ir modifieri m(PCRE_MULTILINE) lai apstrādā vairākas līnijas, nevis tikai pirmo (pēc defaulta), s (PCRE_DOTALL) ļauj iekļaut \n simbolus atrastajā, U (PCRE_UNGREEDY) - meklēt īsāko sakrītošo stringu

Link to comment
Share on other sites

Par @ atdalītāju / vietā esmu pieradis likt tāpēc, ka citādi parsējot HTML tegus, kuros ir / simbols (piemēra </div>) tad nākas to eskeipot: preg_match('/\<\/div\>/', ...). Nesmuki izskatās, taču lietojot @ simbolu: preg_match('@\</div\>@', ...) ir nedaudz labāk saprotams uzreiz. Protams, ja vajg regulārā izteiksmē pašu @ simbolu, tad var lietot citu retu simbolu par atdalītāju, piemēram, ~ utt

Link to comment
Share on other sites

Nē nu tas, ka ir pašā tekstā tas jau nekas. Galvenais, ka rakstot reg.izteiksmi tur tev nevajag lietot to @ simbolu, jo citādi to uzskatīts par atdalītāju nevis machošanai vajadzīgu simbolu.

Link to comment
Share on other sites

×
×
  • Create New...