Autor Zpráva
B
Profil *
Chtěl bych nějak pomocí preg_replace prohledat všechny href="" na stránce a nahradit v nich & za & ale nevím jak na to... jediné co se mi povedlo je nahradit & v celém textu, ale já to chci jen v href="" Momentálně to mám tak že preg match najde všechny href="" a pak je cyklem projíždím a pomocí str_replace v nich nahrazuju entity... to je ale takové škaredé řešení a určitě náročné na výpočetní výkon... zajímalo by mě jestli to jde nějak udělat v tom preg_replace vše najednou... děkuju
martindeveloper
Profil
B:
<?php

$html = "<a href=\"http://web.cz/test.php?var=2&var2=asdas&var3=522\">Link</a><br /><a href=\"http://web.cz/test.php?var=b&var2=a&var3=4\">Link 2</a>";
$result = preg_replace("/href=\"[a-zA-Z]&[a-zA-Z]\"/", "&amp;", $html);

?>
Radek9
Profil
martindeveloper:
He?

B:
Regulární řetězce moc neovládám, ale jednou mi tady poradili něco podobného, takže jsem to upravil:
preg_replace('~(href=".*")~Ue', "stripslashes(str_replace('&', '&amp;', '$1'))", '<a href="test?test=test&test1=test1&test2=test2">něco</a>');
mckay
Profil
B:
Nepřináším žádné řešení jen se pokusím poradit. Jestli to děláte kvůli validitě (jiný důvod mě nenapadá), nevidím důvod, proč by jste to měl dělat pouze v odkazech - jakýkoliv nepěkný znak na stránce je zvykem psát entitou.
martindeveloper
Profil
Radek9:
Pokud jsem pochopil zadání správně ("Chtěl bych nějak pomocí preg_replace prohledat všechny href="" na stránce a nahradit v nich & za &amp;") tak můj regulární výraz udělá přesně to co chce.
Casper
Profil
martindeveloper: neudělá
martindeveloper
Profil
Casper:
Script jsem testoval na PHP 5.3.1 a fungoval.
Majkl578
Profil
[#7] martindeveloper
O tom dost pochybuji.
martindeveloper
Profil
Majkl578:
Vskutku ano, v PHPDesigneru 7.1 (obsahující PHP 5.3.1) jsem následující script pustil přes "Run" a výsledek byl uspokojivý:

Script:
$html = "<a href=\"http://web.cz/test.php?var=2&var2=asdas&var3=522\">Link</a><br /><a href=\"http://web.cz/test.php?var=b&var2=a&var3=4\">Link 2</a>";
$result = preg_replace("/href=\"[a-zA-Z]&[a-zA-Z]\"/", "&amp;", $html);

var_dump($result);


Výsledek:
string(136) "<a href="http://web.cz/test.php?var=2&amp;var2=asdas&amp;var3=522">Link</a><br /><a href="http://web.cz/test.php?var=b&amp;var2=a&amp;var3=4">Link 2</a>"
martindeveloper
Profil
Tak jsem to zkusil na localhostu (IIS 7.5 a PHP 5.2.13 x64) a opravdu nefungoval.
Ale v PHPDesigneru s PHP 5.3.1 vážně funguje.
Radek9
Profil
martindeveloper:
Jak by mohl fungovat, když před i za & mohlo být jen písmeno? A i kdyby to bylo v tomto tvaru, tak by to nahradilo pouze jeden &.
Edit: A ještě jsem si všimnul, že by to nahradilo i href a uvozovky.
martindeveloper
Profil
Radek9:
Jo, to jsi teď uvědomuji že není ten regulár úplně správně, ale můžu klidně ukázat screenshot z PHPDesigneru ve kterém se to vážně nahradí :)
Hold si ze mě PHPDesigner dělá srandu.
Chamurappi
Profil
Reaguji na martindevelopera:
PHP sice neumím, ale na první pohled bych řekl, že tvůj kód nahradí celý atribut href obsahující právě jedno písmeno, jeden & a jedno písmeno za &amp;. Z <a href="a&b"> to udělá <a &amp;>, ostatní případy to musí minout. Nebo ne?


Reaguji na B:
K čemu to potřebuješ?
martindeveloper
Profil
Chamurappi:
Ano tedka když na to znova koukám tak je to vážně špatně, ale vážně PHPDesigner vypisuje entity.
Mj. je to právě pro mě dobré poučení že nemám postovat ukvapené příspěvky které jsem bohužel ani nekontroloval.
B
Profil *
Ten skript by nahradil pouze odkazy ve tvaru href="a&b" a žádné jiné. částečné řešení by sice bylo href=".*&.*" ungreedy ale tam je problém že to nahradí jen jedno & a ne všechny v tom odkazu
martindeveloper
Profil
Ano takže regulár jsem ukvapeně napsal špatně, ale furt nechápu pročpak mi PHPDesigner ukazuje entity.
Mj. screenshot - http://img341.imageshack.us/img341/9171/hmmuk.jpg

Jinak jak tak koukám tak mi to změnilo <br /> na <br> takže začínám uvažovat o tom že to asi protahuje přes nějaký filtr ten výstup, což nikdy v nastavení nevidím.
B
Profil *
Tak sem to nakonec nějako vyřešil. Udělal sem aby to nahradilo na stránce všechny ampéry kromě těch v entitách a zatím to zdá fugnuje, validátor hned ukazuje o párset míň errorů :)
B
Profil *
Tak ještě jeden problém, chci tagům img které nemají alt přidat alt="", ale zaboha to nemůžu rozchodit:
echo  preg_replace("/(<img src=\".*\".*(?!alt=\".*\").*)>/iU", '$1 alt="">', '<img src=""> <img src="" alt="sdsd š č "> <img src="" alt="">');
tohle přidá alt="" i těm img tagům co už alt mají, i když tam je jasně v závorce pomocí (?!alt= definované že alt tam nesmí být.. tak kde je zakopaný pes?

Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
__construct
Profil
B:
Na to nepotrebuješ regulár:
strpos() .. pozri si hneď prvý example .. ;-)
B
Profil *
__construct:
No to nějak nechápu jak mi pomůže, ta funkce jen prohledá celé tělo stránky a podívá se jestli tam někde je alt=", nebo není... já potřebuju projet všechny img tagy a pokud tam není tak ho doplnit, takže bych stejně musel použít nějaký regulární výraz a cykl kde bych vystříhal img tagy apostupně je strpos projížděl... jestli to de nějak nahradit všechno najednou tím strpos, tak to asi nechápu... jde to?

Každopádně bych chtěl vědět jakou chybu mám v tom regulárním výrazu, protože sem se s tím páskoval asi půl hodiny a zaboha sem to nemohl rozchodit :(
Radek9
Profil
B:
Teď jsem napsal tohle:
<?php
function f($s){
  if(stristr($s, "alt=")!=false){
    return $s;
  }
  else{
    return str_replace(">", ' alt="">', $s);
  }
}
echo preg_replace("~(<img .*>)~Uei", "stripslashes(f('$1'))", '<img src=""> <img src="" alt="sdsd š č "> <img src="" alt="">');
?>
Mělo by to fungovat.

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