Úprava textu regulárním výrazem – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Úprava textu regulárním výrazem – PHP – Fórum – Programujte.comÚprava textu regulárním výrazem – PHP – Fórum – Programujte.com

 

Pixtr0
Newbie
7. 8. 2013   #1
-
0
-

Zdravím,

potřeboval bych pomoci s jednou úpravou textu. Regulárním výrazům rozumím jen okrajově a bojuji s jednou úlohou. Potřebuji nahradit část textu upraveným textem. Text může mít dvě různé podoby ale potřebuji aby to fungovalo pro obě stejně a to aby na určité místo přidalo specifikovaný text. Viz níže:

Tohle je nepodstatná část textu t('tento text může být jakýkoliv'); pokračování v nepodstatné části textu.

Tohle je nepodstatná část textu t('tento text může být jakýkoliv','','další jakýkoliv text'); pokračování v nepodstatném textu.

Výsledek:

Tohle je nepodstatná část textu t('tento text může být jakýkoliv','potřebná změna');

Tohle je nepodstatná část textu t('tento text může být jakýkoliv','potřebná změna','další jakýkoliv text'); pokračování v nepodstatném textu.

Jedná se o tu část která začíná t( a končí ); Ve skutečnosti se jedná o funkci, do které chci dynamicky přidat jednu z proměnných.

Děkuji za pomoc

Nahlásit jako SPAM
IP: 194.228.11.–
peter
~ Anonymní uživatel
4016 příspěvků
7. 8. 2013   #2
-
0
-

jake byli tve pokusy?
[^,)]* - jakykoliv znak mimo carku a zavorku opakovany 0 az nekonecno
\' - apotrof '
\( - zavorka (
\) - zavorka )
.*?abc - jakykoliv znak (.) opakovane 0-nekonecno (*), dokud nenarazis (?) na retezec abc
abc|def - najdi retezec abc nebo def

 

Nahlásit jako SPAM
IP: 193.84.207.–
Pixtr0
Newbie
7. 8. 2013   #3
-
0
-

Můj pokus:

preg_replace("\bt\(.*\);","\bt(.*,\'".$zmena."\'.*\);",$text);
Nahlásit jako SPAM
IP: 194.228.11.–
Pixtr0
Newbie
7. 8. 2013   #4
-
0
-

Další pokusy:

 Varianta 1:

$text = "Tohle je nepodstatná část textu t('tento text může být jakýkoliv'); pokračování v nepodstatné části textu.";
$zmena = "zmena";

Požadovaný výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena'); pokračování v nepodstatné části textu.

preg_replace("/\bt\((['|\"].*['|\"])(,.*)(,.*)\);/","t($1,'".$zmena."'$3);",$text);
preg_replace("/\bt\((['|\"].*['|\"])(,*['|\"].*['|\"])(,.*)\);/","t($1,'".$zmena."'$3);",$text);

Výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv'); pokračování v nepodstatné části textu.
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena'); pokračování v nepodstatné části textu.

Varianta 2:

$text = "Tohle je nepodstatná část textu t('tento text může být jakýkoliv',''); pokračování v nepodstatné části textu.";
$zmena = "zmena";

Požadovaný výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena'); pokračování v nepodstatné části textu.

preg_replace("/\bt\((['|\"].*['|\"])(,.*)(,.*)\);/","t($1,'".$zmena."'$3);",$text);
preg_replace("/\bt\((['|\"].*['|\"])(,*['|\"].*['|\"])*(,.*)*\);/","t($1,'".$zmena."'$3);",$text);

Výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv',''); pokračování v nepodstatné části textu
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','','zmena'); pokračování v nepodstatné části textu.

Varianta 3:

$text = "Tohle je nepodstatná část textu t('tento text může být jakýkoliv','','další jakýkoliv text'); pokračování v nepodstatné části textu.";
$zmena = "zmena";

Požadovaný výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena','další jakýkoliv text'); pokračování v nepodstatné části textu.

preg_replace("/\bt\((['|\"].*['|\"])(,.*)(,.*)\);/","t($1,'".$zmena."'$3);",$text);
preg_replace("/\bt\((['|\"].*['|\"])(,*['|\"].*['|\"])*(,.*)*\);/","t($1,'".$zmena."'$3);",$text);

Výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena','další jakýkoliv text'); pokračování v nepodstatné části textu.
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','','další jakýkoliv text','zmena'); pokračování v nepodstatné části textu.

Jeden funguje v prvním případě a druhý v tom třetím. Potřeboval bych ale aby to fungovalo ve všech třech...

Nahlásit jako SPAM
IP: 194.228.11.–
peter
~ Anonymní uživatel
4016 příspěvků
8. 8. 2013   #5
-
0
-

Dik, to je o moc lepsi, ale mohl jsi z toho udelat priklad :) 

<?php
$patt1 = "/\bt\((['|\"].*['|\"])(,.*)(,.*)\);/";
$patt2 = "/\bt\((['|\"].*['|\"])(,*['|\"].*['|\"])(,.*)\);/";
$patt3 = "/\bt\((['|\"].*['|\"])(,*['|\"].*['|\"])*(,.*)*\);/";
$zmena = "zmena";
$repl  = "t($1,'".$zmena."'$3);";

// --- Varianta 1 ---

$str1  = "Tohle je nepodstatná část textu t('tento text může být jakýkoliv'); pokračování v nepodstatné části textu.";

echo '<br>'.preg_replace($patt1,$repl,$str1);
echo '<br>'.preg_replace($patt2,$repl,$str1);

/*
Požadovaný výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena'); pokračování v nepodstatné části textu.

Výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv'); pokračování v nepodstatné části textu.
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena'); pokračování v nepodstatné části textu.
*/



// --- Varianta 2 ---

$str2  = "Tohle je nepodstatná část textu t('tento text může být jakýkoliv',''); pokračování v nepodstatné části textu.";

echo '<br>'.preg_replace($patt1,$repl,$str2);
echo '<br>'.preg_replace($patt3,$repl,$str2);

/*
Požadovaný výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena'); pokračování v nepodstatné části textu.

Výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv',''); pokračování v nepodstatné části textu
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','','zmena'); pokračování v nepodstatné části textu.
*/



// --- Varianta 3 ---

$str3  = "Tohle je nepodstatná část textu t('tento text může být jakýkoliv','','další jakýkoliv text'); pokračování v nepodstatné části textu.";

echo '<br>'.preg_replace($patt1,$repl,$str3);
echo '<br>'.preg_replace($patt3,$repl,$str3);

/*
Požadovaný výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena','další jakýkoliv text'); pokračování v nepodstatné části textu.

Výsledek:
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','zmena','další jakýkoliv text'); pokračování v nepodstatné části textu.
Tohle je nepodstatná část textu t('tento text může být jakýkoliv','','další jakýkoliv text','zmena'); pokračování v nepodstatné části textu.
*/


$repl2 = "t($1,'".$zmena."'$2);";

$patt4 = "/\bt\((['\"].*?['\"]),['\"]['\"](,.*)*?\);|\bt\((['\"].*?['\"])(,.*)*?\);/";

echo '<br>';
echo '<br>'.preg_replace($patt4,$repl2,$str1);
echo '<br>'.preg_replace($patt4,$repl2,$str2);
echo '<br>'.preg_replace($patt4,$repl2,$str3);

?>

V podstate bys tu prvni cast nepotreboval, pokud by ti nevadilo, ze druhy priklad konci 'zmena','') .Mno, a co se tyce chyb, nemas tam ty otazniky a nejspis chybne mas pouzity symbol pro nebo |, tak jsem ho smazal ze zavorky.
[abc] = pismeno a nebo b nebo c (pismena)
a|b|c = pismeno a nebo b nebo c (retezce)
aa|b|c - aa nebo b nebo c (retezce)
a[abc]|b[abc]|c[abc] - (aa nebo ab nebo ac) nebo (ba nebo bb nebo bc) nebo (ca nebo cb nebo cc)
[abc][abc] - totez
['|\"] - znak ' nebo znak | nebo znak "
 

Nahlásit jako SPAM
IP: 193.84.207.–
peter
~ Anonymní uživatel
4016 příspěvků
9. 8. 2013   #6
-
0
-

Prisel jsem tam jeste na par chyb. Zatim to neumim dat dohromady, protoze se vyrazy shoduji. kod na konci jsem upravil na 

$repl2 = "t($1,'".$zmena."'$2$3);";

$p = "'.*?'|\\\".*?\\\"";
$p = "'[^']+'|\\\"[^\\\"]+\\\"";
$patt4_1 = "\bt\(($p)()()\);";
$patt4_2 = "\bt\(($p)(?:,(?:''|\"\"))()\);";
//$patt4_3 = "\bt\(($p)(,[^)]*)\);";
$patt4_3 = "\bt\(($p)(?:,(?:''|\"\"))()(,[^)]*)\);";
$patt4 = "/(?:".$patt4_1.")|(?:".$patt4_2.")|(?:".$patt4_3.")/";

echo '<br>';
echo $p;
echo '<br>'.$str1;
echo '<br>'.preg_replace("/".$patt4_1."/",$repl2,$str1);
echo '<br>'.$str2;
echo '<br>'.preg_replace("/".$patt4_2."/",$repl2,$str2);
echo '<br>'.$str3;
echo '<br>'.preg_replace("/".$patt4_3."/",$repl2,$str3);

echo '<br>';
echo '<br>'.$str1;
echo '<br>'.preg_replace($patt4,$repl2,$str1);
echo '<br>'.$str2;
echo '<br>'.preg_replace($patt4,$repl2,$str2);
echo '<br>'.$str3;
echo '<br>'.preg_replace($patt4,$repl2,$str3);
Nahlásit jako SPAM
IP: 193.84.207.–
peter
~ Anonymní uživatel
4016 příspěvků
9. 8. 2013   #7
-
0
-

 Uplne posl. zmena. dal uz na vic asi neprijdu. Ty vyrazy se nejak kryji a vzdy funguje jen jeden z nich. Takze, kdyz se ti ten treti podari upravit tak, aby se nekryl s druhym, tak to budes mit poresene.

\\ = lomitko \
\( - zalomitkovana zavorka preo reg. vyraz, ale protoze lomitko je treba pro string take zalomitkovat, tak \\(
\" - zalomitkovana uvozovka, ale protoze lomitko i uvozovku je pro string zacinajici uvozovkou take zakomentovat, tak \\\"
.* - znamena jakykoliv znak 0-nekonecko, radeji bych pouzil jakykoliv znak krome uvozovky, pripadne ukoncovaci avorky [^']*
? - ten tam asi v php nepatri, ? znamena (0-1 pri poctu znaku nebo) 1 jakykoliv znak nebo v js navic omezuje vyrazu vybirani do prvni nalezene shody za otaznikem, proto jsem ti to tam prvne vycital (dlouho jsem ted se slozitejsimi reg. vyrazy nepracoval v php). Ale protoze to tam vlastne nepatri, moje chyba.

//$p = "'.*?'|\\\".*?\\\"";
$p = "'[^']+'|\\\"[^\\\"]+\\\"";
//$patt4_1 = "\\bt\\(($p)()()\\);";
$patt4_2 = "\\bt\\(($p)(?:,(?:''|\\\"\\\"))?()()\\);";
//$patt4_3 = "\bt\(($p)(,[^)]*)\);";
//$patt4_3 = "\\bt\\(($p)(?:,(?:''|\\\"\\\"))()(,[^\\)]+)\\);";
$patt4_3 = "\\bt\\(($p)(?:,''|,\\\"\\\")()(,[^\\)]+)\\);";
$patt4 = "/(?:".$patt4_2.")|(?:".$patt4_3.")/";
//(?:".$patt4_1.")|

echo '<br>';
echo '<br>'.$p;
echo '<br>'.$patt4;
Nahlásit jako SPAM
IP: 193.84.207.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 31 hostů

Podobná vlákna

Úprava textu — založil A-dy

Uprava textu v php — založil roman.jaros

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý