Autor Zpráva
gmvasek
Profil *
Dobrý den,

programuji si CMS v PHP a zrovna řeším nahrazování BBCode značek. Značnou část již mám ošetřenou regulárními výrazy, ale potřeboval bych pomoct s funkcí preg_replace_callback. Mám 4 regulární výrazy, které pracují s URL:

// Anchors

$mask = '$[url](http://(.*?))[/url]$ui';
$resource = preg_replace($mask, ' <a href="$1">$2</a> ', $resource);

$mask = '$[url=((http://|ftp://|https://)([^[]+?))](.*?)[/url]$ui';
$resource = preg_replace($mask, '<a href="$1">$4</a>', $resource);

$mask = '^(?#WebOrIP)((?#protocol)((http|https)://)?(?#subDomain)(([a-zA-Z0- 9]+.(?#domain)[a-zA-Z0-9-]+(?#TLD)(.[a-zA-Z]+){1,2})|(?#IPAddress)( (25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]).(25[0-5 ]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0 -4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0 -9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])))+(?#Port)(:[1-9][0-9]*)? )+(?#Path)((/((?#dirOrFileName)[a-zA-Z0-9_-\%~+]+)?)*)?(?#extensio n)(.([a-zA-Z0-9_]+))?(?#parameters)(?([a-zA-Z0-9_-]+=[a-z-A-Z0-9_ -\%~+]+)?(?#additionalParameters)(&([a-zA-Z0-9_-]+=[a-z-A-Z0-9_- \%~+]+)?)*)?^';
$resource = preg_replace_callback($mask, 'preved', $resource);

// Images
$mask = '$[img](http://[^]]*.(png|jpeg|jpg|gif))[/img]$ui';
$resource = preg_replace($mask, '<img src="$1" alt="Obrázek" />', $resource);


Ten třetí nahrazuje adresy v textu (http://...) odkazy. A ten mi právě dělá problém. Nahrazuje i adresy převedené do tagů a pak vzniká zmatek. Chtěl jsem to vyřešit pomocí preg_replace_callback, že bych další funkcí kontroloval, jestli je předaný výraz v uvozovkách či nikoliv. Ale tady mám problém. Nemám možnost dosadit do té funkce další parametr s odkazem na kód, takže nemám v čem hledat. Zkoušel jsem i global na různých místech, create_function, ale nic nepomáhá. Ke kódu se prostě nedostanu (v $resource je ten kód). Poradíte?

Zdroj funkce:

function preved($retezec)

{
if(!strpos($resource, '"' . $retezec[1] . $retezec[13] . $retezec[16] . '"'))
{
$ret = '<a href="' . $retezec[1] . $retezec[13] . $retezec[16] . '">' . $retezec[4] . '</a>';
}

else
{
$ret = $retezec[1] . $retezec[13] . $retezec[16];
}

return $ret;
}
bukaj
Profil
moc nechápu, co vlastně chceš. ale nešel by poupravit ten regulární výraz? například pomocí tzv. záporného (či kladného) tvrzení o předchozím (popř. následujícím)? viz speciální závorkové konstrukce
gmvasek
Profil *
To jsem zkoušel, ale pak došlo ke zmodifikování výsledku... viz. http://regexlib.com/RETester.aspx?regexp_id=1363
Zkuste si to zmodifikovat výrazy [^"] nebo (?!") přidáním na začátek nebo na konec....
gmvasek
Profil *
Potřebuji se dostat k promněnné $page, kterou volám jako parametr funkce bbcodes. Pak mám další funkci (preved), které funkce preg_replace_callback předává řetězec odpovídající regulárnímu výrazu jako parametr. A z té funkce se nedostanu do promněnné $page.

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: