Autor Zpráva
návštěvník
Profil *
Potřeboval bych najít regulární výraz na nalezení
printm($lan->get( , čísla za get( a závorka za číslem (max. 3 číslice).

subjekt:
<TR>
printm($lan->get(1), something ));
printm($lan->get(12), something2 ));
printm($lan->get(123), something3 ));
  <TD align=center VALIGN="TOP"><br><br>

Mám toto. ale nefunguje:
/(.*)(printm\($lan->get\()(\d{1,3})(\))(.*)/

Poradí někdo?
Jan Tvrdík
Profil
'/printm\\(\\$lan->get\\(\\d+\\), something \\)\\)/'
návštěvník
Profil *
Díky
návštěvník
Profil *
Můžete poradit s tímto regulárním výrazem?

/.{0,15}[\W]sprintm\(\$lan->get\((\d{1,3})\).{0,15}/

Má sloužit k nahrazení řetězců jako
if($count == '0') sprintm($lan->get(205));
za jiný řetězec s jiným číslem, např:
if($count == '0') sprintm($lan->get(6);

Problém je v tom, že se mi nahradí pouze několik málo výskytů a ostatní uvedené na obrázku níže, zůstává nezměněno - tedy nenalezeno - viz obrázek níže. Kdyby bylo nalezeno tak by bylo i zaměněno za sprintm($lan->get(^ a vyskočila by mi hláška.

http://oi39.tinypic.com/30myefl.jpg

Je to součást skriptu na nahrazování čísel v souborech, a v případě, že je text nalezen tak to píše hlášku. V tomto případě žádná hláška není.

Ještě před tím než spouštím regulární výraz provádím nejdříve kontrolu jestli se v souboru vyskytuje string
sprintm($lan->get(
Tedy na starost to mají dva příkazy, strpos a preg_match. strpos by měl být v pořádku, ale ten regulární výraz a preg_match v tom si nejsem jistý.

    if ( strpos ( $content , $this->c->find->sub_string) !== false)
    {
        $count = preg_match_all( "/".$this->regFind[0]."/" , $content, $matches );
        if (!$count)
          {
          print_r($matches);
          echo "not found in $file: ".$this->subFind."<BR>\n";
          }
        else
          {
          // yde n8sleduje smyčka která prochází výsledky z pregmatch
          }
návštěvník
Profil *
Tak chyba se už našla (úplně jinde). Nemusíte odpovídat. Chyba v algoritmu
návštěvník
Profil *
Můžete mi poradit proč nefunguje tento regulární výraz na odstranění jakékoliv částky z textu? např. 400,- . Když zaměním \d\d,- za jakékoliv slovo nebo jiný výraz neobsahující číslice tak najde, ale číslice nenajde.

/(?:\W|^)\d\d,-(?:\W|$)/iu

Nemůžu pochopit proč slovo /(?:\W|^)slovo(?:\W|$)/iu najde, ale číslice ne

$mes = "some text 400,- next text";
$mes = preg_replace("/(?:\W|^)\d\d,-(?:\W|$)/iu","",$mes);



pozn. levá část /(?:\W|^)\d\d a pravá část (?:\W|$)/iu jsou součástí metody, která normálně hledá slova, a tam to funguje. Proto tam mám tyhle dvě věci navíc.
DarkMeni
Profil
Protože \d\d čeká na dvě číslice, "400" má tři číslice, místo těch \d\d zkus udělat něco jako \d+ nebo třeba \d{1,4}
návštěvník
Profil *
DarkMeni:
dikes
návštěvník
Profil *
Řeším opět dilema regulárního výrazu. Jak řešit podobnou situaci: nalézt řetězec, který obsahuje slovo voje, ale netýká se to slov jako tvoje a doje. Jelikož tvoje obsahuje voje, tak hrozí, že vrátí jeho podřetězec, což ale v případě tvoje nechci.


Ještě upřesním: pokud nejde čistě o slovo voje, tak nesmí vracet žádný podřetězec, tedy ani voje, ani oje, ani je, ani e.
Kubo2
Profil
návštěvník:
Malo by fungovať (bude hľadať iba slovo voje):
\bvoje\b
DarkMeni
Profil
Zkus ukázat jak vypadá ten regularní výraz, třeba z toho pujde líp pochopit co zkoušíš udělat
Jestli chceš najít slovo "dvoje" nebo "troje", tak můžeš použít spojku | (nebo)
/(tr|dv)oje/
Samostantý slovo můžeš hledat třeba takto
-[\W\d](slovo)[\W\d]-
Tori
Profil
Metaznak \b označuje hranici slova, přidejte ho z obou stran hledaného výrazu.
návštěvník
Profil *
Tori:
$str='Tvoje auto je vojete';

předloha:
/v\bojet\b(?!o|i)/
Snažím se najít slovo "vojete" (v metodě se kterou pracuji dostávám řetězec Tvoje auto je vojete místo Tvoje auto je ******.
Tori
Profil
návštěvník:
Aha, takže chcete vyhledat 1. shodu celého slova a 2. slova, která začínají hledaným výrazem? Zkuste /\bvoje(?:\w+?)\b/iu
návštěvník
Profil *
Tori:
Ono jde o to, že konec se může měnit, ale předek má jenom dva tvary, které mají být nalezeny. Řetězec začíná buď vojet nebo ojet ale jaka bude koncovka to nevím. Takže možná to s tím \b \b nepůjde.


Přemýšlím nad dvěma samostatnýma regulárama.
Jeden tam má t a druhý d:

\bv?ojet.?\b
a druhý co jsem zkoušel byl
[v^d]?ojed[ueo][usm]?
Návštěvník
Profil *
Konečně jsem to vyřešil. Mám na to dvě předlohy:

(?:[^cdkprmt])oje[tl].?
(?:[^cdkprmt])ojed[ueo][usm]?

Testováno na větách:

$str='Tvoje auto je vojete. Otec, dojel v cas. Kojeni neni dojeni. Vojedu tvoje auto klicema. Projedu se autem. Dojedu az zitra. ';

Správný výsledek poté co jsem našel a zaměnil nalezené výsledky:

Tvoje auto je ******. Otec, dojel v cas. Kojeni neni dojeni. ****** tvoje auto klicema. Projedu se autem. Dojedu az zitra.
Návštěvník
Profil *
Jak změnit tento regulární výraz:
    preg_match_all('/(?:\.|^).+(?:\.|$)/u', $message, $matches);
aby $matches[0] obsahoval jednotlivé věty obsažené v textu?
Kubo2
Profil
Návštěvník:
Skús preg_split.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: