Autor Zpráva
dku
Profil
Zdravím potřeboval bych pomoci s tímto:

Mám řetězec např.
$str = 'Lorem ipsum $1 dolor \$1 sit amet.';

a chci nahradit "$1" za nějaký jiný řetězec ale jen tehdy, když ten dolar není escapnutý zpětným lomítkem.

zkoušel jsem něco takového:
$res = preg_replace('~[^\\\]\$1~', '+test+', $str);

to ale nefunguje úplně správně.

Moderátor Joker: Titulek „Regulární výraz“ nevystihoval podstatu dotazu. Příště zkus prosím vymyslet lepší.
Kcko
Profil
$result = preg_replace('/\\\\\$1/s', 'test', $subject);
dku
Profil
Bohužel toto není ono, potřebuji opak - tzv. že "$1" se nahradí za "test", kdežto "\$1" nikoliv.
Jan Tvrdík
Profil
dku:
To samotné lomítko může být escapované? Tedy bude nahrazeno \\$x (= '\\\\$x')?
Kcko
Profil
$subject = 'Lorem ipsum $1 dolor \$1 sit amet.';

echo preg_replace('/(?<= )\$1/s', 'test', $subject);
dku
Profil
Díky, už jsem na to přišel:

$subject = 'Lorem ipsum $1 dolor \$1 sit amet.';

// nahradí všechny výskyty "$1" řetězcem "+test+" ale jen když před "$1" není zpětné lomítko
$res = preg_replace('~(?<!\\\\)\$1~', '+test+', $subject);

echo $res; // Lorem ipsum +test+ dolor \$1 sit amet.

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:

0