2012-11-23 21 views
6

Chcę przekształcić stronę w leet (1337), rozmawiać z XPath i PHP.Konwertuj tekst HTML na Leet (1337) Porozmawiaj z XPath

Można to zrobić tylko z PHP, ale wtedy węzły HTML są również zastępowane przez leet speak.

Przykład ($ html jest strona):

$find = array("a","b","c","d","e","f","g","h","i","j"."k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"); 
$repl = array("4","b","c","d","3","f","g","h","1","j","k","1","m","n","0","p","9","r","5","7","u","v","w","x","y","2"); 
$html = str_replace($find, $repl, $html); 

który zastępuje również węzły HTML.

Czy można to zrobić przy użyciu XPath i PHP z selektorem XPath tekst()? Przykład ($ html jest strona):

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 
$xpath->query('//text()'); 
\\HERE THE REPLACING IN XPATH 
+0

Myślę, że 'text()' zwróci cały tekst na twojej stronie, ale nie będziesz mógł go zaktualizować po ... – j0k

+0

Gdybym zrobił to za pomocą javascript byłoby o wiele zabawniej, ponieważ wtedy możesz zrobić bookmarklet lub coś. –

Odpowiedz

3

Spróbuj tego:

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
$nodes = $xpath->query('//text()'); 
foreach($nodes as $node) 
{ 
    $node->nodeValue = str_replace($find, $repl, $node->nodeValue); 
} 
echo $dom->saveHTML(); 

pamiętać, że jest prawdopodobnie bardziej użyteczne kwerendy XPath do swoich potrzeb:

$nodes = $xpath->query('//head/title/text() | //body//text()'); 

... ponieważ zastąpi to tylko tekst w <head><title> lub tekst będący potomkiem <body>. Prawdopodobnie nie chciałbyś zastąpić możliwych stylów, JavaScript i tego, co masz. ;-)


Na marginesie: Przetestowałem to ze swoimi tablicami Znajdowanie i zamienianie znaków, ale jest coś podejrzanego dzieje się z nimi, że nie mogę wymyślić. Znaki zastępujące nie wydają się pasować do znalezionych znaków przez cały czas. Nie mam pojęcia, dlaczego tak jest.

Mam odtworzył tablic, a te prace dla mnie:

$find = array('a','b','c','d','e','f','g','h','i','j'.'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); 
$repl = array('4','b','c','d','3','f','g','h','1','j'.'k','1','m','n','0','p','9','r','5','7','u','v','w','x','y','2'); 

po prostu nie mogę zrozumieć, dlaczego twoi tablice są nie pracuje dla mnie. : -/Być może problem z kodowaniem? Jeśli ktoś chce dzwonić i zgadywać, proszę.

Edytuj: Jak zauważył rxdazn, problem z pierwszą tablicą stanowił "j"."k", który całkowicie przeoczyłem, jak widać z moich odtworzonych tablic (skopiowałem $ find do $ repl, zastąpiłem cudzysłowy i wypełniłem znaki).

+5

'" j "." K "' o to, co jest nie tak w pierwszej tablicy – rxdazn

+1

@rxdazn nice catch! –

+1

jako notatkę boczną, można również użyć zakresu() '$ find = zakres (" a "," z ");' – HamZa