Autor Zpráva
Sanky
Profil
Dobrý den,
Udělal jsem si cyklus, který mi pomocí strpos() najde první umístění určeného textu v řetězci. Nyní bych potřeboval smazat to, co je na daných souřadnicích (vím přesně co chci smazat a kde je to umístěno) a poté nahradit novým textem.
Snažil jsem se to provést pomocí preg_replace():
text2 = preg_replace("0d0a",'<font color="#C79200">5c</font>', $text2, 1);

Háže mi to ale následující chybu:
Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in ___.php on line 34

Jistě je i jiné řešení než jednou vyhledat a nahradit text, když už vím jeho umístění.
Mohl by mi někdo prosím pomoci? Jsem v PHP relativně nový.

Děkuji předem
Sanky
Majkl578
Profil
[#1] Sanky
Delimiter must not be alphanumeric or backslash
Zapoměl jsi na delimitery, které nesmí být písmena, čísla a zpětné lomítko. Např.:
preg_replace('~0d0a~','<font color="#C79200">5c</font>', $text2, 1);
Sanky
Profil
Děkuji za pomoc -- program teď nehází chybu, nicméně zasekne se do nekonečného cyklusu.
Kód mám následující:
$nl    = 0;
$i     = 0;
$bezi  = true;
while ($bezi != false)
{
	$nl    = strpos($text2,'0d0a',$nl);
	echo $nl;
	if($nl == false)
	{
		$bezi=false;
	}elseif (strpos($text2,'0d0a0d0a',$nl)<$nl+3)
	{
		$text2 = preg_replace("~0d0a0d0a~",'<font color="#C74F00">004c823e</font>', $text2, 1);
		$i = 0;
	}elseif($i == 0)
	{
		$text2 = preg_replace("~0d0a~",'<font color="#C79200">5c</font>', $text2, 1);
		$i++;
	}elseif($i == 1)
	{
		$text2 = preg_replace("~0d0a~",'<font color="#C79200">004c603e</font>', $text2, 1);
		$i = 0;
	}else
		{echo "WHOOPS AN ERROR";}
}



Má to buď najít dva nové řádky (a ty nahradit), nebo jeden a nahradit ho podle toho jestli je sudý nebo lichý.
Alphard
Profil
Sanky:
Abych pravdu řekl, nechce se mi studovat váš algoritmus a vzhledem k živosti tohoto vlákna ani nikomu jinému. Zkuste srozumitelně popsat, čeho chcete dosáhnout, ideálně na příkladu vstupu a výstupu.

Z prvního příspěvku "Udělal jsem si cyklus, který mi pomocí strpos() najde první umístění určeného textu" moc moudrý nejsem. Jestli hledáte pouze první umístění, tak nevím, proč ten cyklus.
AM_
Profil
toto
while ($bezi != false)
{
    $nl    = strpos($text2,'0d0a',$nl);
    echo $nl;
    if($nl == false)

by šlo nahradit pouze tímto
while ($nl = strpos($text2,'0d0a',$nl)) {

protože
- příkaz přiřazení ve výrazu vrací to, co bylo přiřazeno
- u podmínky ve while není nutné uvádět != false, protože výrok "A" je to samé jako "není nepravda, že A"

jinak proč ti to cyklí nejlíp zjistíš sám, buď použij nějaký debugger, nebo si třeba v každém provedeném cyklu vypiš na výstup, co se děje (na jaké pozici to našlo 0d0a, jak vypadá řetězec po nahrazení...)

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