Portál AbcLinuxu, 11. května 2025 10:33

Dotaz: [PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \n?

20.1.2006 18:26 babca
[PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \n?
Přečteno: 343×
Odpovědět | Admin
Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \n?

"Vsechny" znaky se zapisou: . Znak konce radku je \n (v uvozovkach tedy \\n) Jak ale napsat, aby mi parser vzal uplne vsechny znaky i s konci radku?

Dik..
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.1.2006 18:55 machr
Rozbalit Rozbalit vše Re: [PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \
Odpovědět | | Sbalit | Link | Blokovat | Admin
.|\\n
nejsem si jistej, ale . (tecka) by mela znamenat vsechny znaky vcetne znaku konce radku
20.1.2006 21:07 babca
Rozbalit Rozbalit vše Re: [PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \
Snažím se použít následující (všimněte si (.+), tím zbytkem se nezabývejte):

$text = preg_replace("|\[$tag_name\](.+)\[/$tag_end\]|i", $replace[open]."\\1".$replace[close], $text)

No a podle stránky http://www.root.cz/clanky/regularni-vyrazy-1/
"....Tuto činnost obstará znak tečka (.). Při hledání jí vyhoví libovolný znak kromě konce řádku. ...."

Tak jsem se snažil nahradit (.+) za něco ve stylu .|\\n - jak říkás - u mě tedy nějak takto - ([.|\\n]+), ale to mi php nebere!

$text = preg_replace("|\[$tag_name\]([.|\\n]+)\[/$tag_end\]|i", $replace[open]."\\1".$replace[close], $text);
Pomůže někdo? Kde je chyba? Dík...
20.1.2006 22:14 machr
Rozbalit Rozbalit vše Re: [PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \

zkuste tohle. nejsem si jistej, jestli u toho \n opravdu prijdou 2 zpetny lomitka jak pisete ve vasem puvodnim prispevku.

$text = preg_replace("|\[$tag_name\](((.)|(\n))+)\[/$tag_end\]|i", $replace[open]."\\1".$replace[close], $text);

par zavorek navic nikdy neuskodi ;)

symbol '|' znamena 'nebo'. takze '.|\n' znamena tecka (libovolnej znak) nebo \n

PS: pokud date cokoli do hranatych zavorek (vcetne tecky) tak je to mysleno jako libovolny 1 znak z tyhle zavorky

20.1.2006 22:51 babca
Rozbalit Rozbalit vše Re: [PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \
No a do hranatych zavorek se zadavaji povolene znaky, tak [.|\n]

nekde jsem se stejne docet, ze ma byt \\n - stejne jako u \\1, \\2 - vstupni udaj ma byt \n (resp. \1, \2) - a aby se mohl napsat v php do uvozovek, musi se zpetna lomitka zdvojit.

Jinak tvoje reseni zase nefunguje... :-(, zkousel jsem taky jeste plno dalsich variant jak toho myho, tak tvyho, ale stale to konci chybou typu Warning: Unknown modifier '\' in .... on line ...

vadi mu aj ([u|a]+) atd, co delam spatne?

jo a taky jsme se docet, ze kdyz je v hranatych zavorkach tecka, tak zastupuje normalni tecku... no nevim...
21.1.2006 00:44 machr
Rozbalit Rozbalit vše Re: [PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \

jak se na to divam, tak je tam spatne vic veci...

1. funkce preg_replace ocekava jako prvni 2 parametry pole vyrazu a nahrad. pokud pro ni nemas nejaky specialni duvod, pouzi misto ni ereg_replace().

2. ta chyba co ti to pise je vlastne varovani, ze tam mas neznamou escape-sequenci - treba hned to prvni \[ tusim neni platna. Zrejme tam patri dve lomitka jak u toho \n.

tohle napr funguje:

	$text = "
	machr<br>
	[xxx]<br>
<br>
	[/xxx]<br>
	rulezzz<br>
	";

	print $text; print "<br>";
	print "################################<br>";

	$text = ereg_replace("\\[xxx\\](.|\\n)+\\[/xxx\\]", "REPLACED", $text);

	print $text; print "<br>";

VYSTUP:
machr
[xxx]

[/xxx]
rulezzz

################################
machr
REPLACED
rulezzz

teda, jestli sem pochopil spravne, ze to ma najit a nahradit vsechny retezce typu:

[xxx] .... [/xxx]

PS: pokud das do hranatych zavorek libovolny symbol (takze i tecku) tak zastupuje prave ten symbol a jeho specialni funkce je zrusena.

21.1.2006 14:33 babča [www.oplatek.org]
Rozbalit Rozbalit vše Re: [PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \
Hele moc dík, že sis s tím dal takovou práci...

Ja byl pořád v domnění, že sviská čárka ( | ) se používá jen v oněch hranatých závorkách... :-)

To by mohlo fungovat... asi nejsprávnější odpověď však našel halogen - modifikátor "s" - funguje to bezvadně...

našl jsem ho vysvětlený třeba na (PHP.net)

$text = preg_replace("|\[$tag_name\](.+)\[/$tag_end\]|Uis", $replace[open].$vlozit.$replace[close], $text);

Jinak, s tema hranatyma zavorkama, to je zajimavy - ted nad tim premyslim...jaktoze to funguje s jednim lomitkem?

Ano, poznals správně, tento kód je pro převod značek do html... :-)

function nahradit_znacky_za_html ($text, $target_blank = "ne")
{
if ($target_blank == "ano")
{
$target_blank = "target='_blank'";
}
else
{
$target_blank = "";
}

$tag_array["b"] = array("open"=>"<b>", "close"=>"</b>");
$tag_array["i"] = array("open"=>"<i>", "close"=>"</i>");
$tag_array["u"] = array("open"=>"<u>", "close"=>"</u>");
$tag_array["img"] = array("open"=>"<img src='", "close"=>"'>");
$tag_array["mail=(.+)"] = array("open"=>"<a href='mailto:", "close"=>"'>\\2</a>");
$tag_array["color=(.+)"] = array("open"=>"<span style='color: ", "close"=>"'>\\2</span>");
$tag_array["size=(.+)"] = array("open"=>"<span style='font-size: ", "close"=>"'>\\2</span>");
$tag_array["font=(.+)"] = array("open"=>"<span style='font-family: ", "close"=>"'>\\2</span>");
$tag_array["url"] = array("open"=>"<a href='", "close"=>"' ".$target_blank.">\\1</a>");
$tag_array["url=(.+)"] = array("open"=>"<a href='", "close"=>"' ".$target_blank.">\\2</a>");
//$tag_array["url=?(http://)(.+)"] = array("open"=>"<a href='http://", "close"=>"' >\\2</a>");

$tag_array["quote=(.+)"] = array("open"=>"<div class='komentare-diskuze-puvodni-autor'>\\1 napsal:</div><div class='komentare-diskuze-puvodni-text'>", "close"=>"</div></div>");

foreach($tag_array as $tag_name=>$replace)
{
if (ereg("quote=.+", $tag_name))
{
$vlozit = "\\2";
}
else
{
$vlozit = "\\1";
}

$tag_end = preg_replace("/\W/Ui", "", $tag_name);
$text = preg_replace("|\[$tag_name\](.+)\[/$tag_end\]|Uis", $replace[open].$vlozit.$replace[close], $text);
}

$text = str_replace("[hr]", "<<hr size='1' noshade>", $text);
$text = str_replace("[br]", "<br />\n", $text);

return $text;
}

jen jetě řeším, jak automaticky doplnit http:// do značek, kde adresa odkazu zčíná jen třeba www (bez http://)... Snažil jsem se o to na zakomentovaném řádku, ale to mi nejede (jak jinak, že)
21.1.2006 10:11 Marek:)
Rozbalit Rozbalit vše Re: [PHP] Jak zapsat regularni vyraz, aby to vzalo vsechny znaky i s \n?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Asi je to tím, že regulární výrazy perlu, z kterých vychází php, tečku nezahrnují. viz http://www.linuxsoft.cz/article.php?id_article=1000
21.1.2006 11:36 halogan | skóre: 7 | Praha
Rozbalit Rozbalit vše Snadné řešení
Odpovědět | | Sbalit | Link | Blokovat | Admin
Modifikátor s :) |regexp|s
vim isn't just for nerds

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.