2012-11-23 9 views
6

Bir web sayfasını XPath ve PHP ile konuşarak leet'e (1337) dönüştürmek istiyorum.HTML metnini Leet'e (1337) dönüştürme XPath ile konuş

Sadece PHP ile yapılabilir, ancak HTML düğümleri de leet konuşmasıyla değiştirilir.

$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); 

ayrıca HTML düğümleri yerine geçer:

Örnek ($ html web sayfasıdır).

Bu, XPath seçicisi text() metinle yapılabilir mi? Örnek ($ html web sayfasıdır):

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

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

Sanırım 'text() ', sayfanızdaki tüm metni döndürecek ancak sizden sonra güncelleme yapamayacaksınız. – j0k

+0

Bunu javascript ile yapmak benim fikrimce çok daha eğlenceli olurdu çünkü bir bookmarklet yapabilirsiniz ya da başka birşey. –

cevap

3

bu deneyin: Bu muhtemelen ihtiyaçlarınız için daha yararlı xpath sorgusu olduğunu

$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(); 

Not:

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

... Bu, yalnızca <head><title>'daki metni veya <body>'un soyundan gelen metni değiştireceğinden. Muhtemelen olası stilleri, Javascript ve ne var değiştirmek istemem. ;-) Yan not


: Ben bulmak ve değiştirmek karakter Dizilerinize ile test ettik, ancak balık onlarla bir şeyler ı anlamaya olamaz, yoktur. Yeni karakterler, her zaman bulunan karakterlerle aynı hizaya gelmiyor. Neden olduğu hakkında hiçbir fikrim yok.

benim için diziler ve bu işi yeniden ettik: sizin diziler benim için çalışan değil neden

$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'); 

Sadece bilemiyorum. : -/Belki bir kodlama sorunu? Kimse takılmak ve bir tahminde bulunmak isterse, lütfen yapın.

Düzenleme: rxdazn'ın fark ettiği gibi, "j"."k", ilk dizideki sorun oldu, ki yeniden düzenlenmiş dizilerimden görebildiğiniz gibi tamamen göz ardı ettim ($ repl'e $ repl'e kopyaladım, tırnakları değiştirdim ve leet karakterleri doldurdum)).

+5

'" j "." K "' ilk dizide neyin yanlış olduğunu burada – rxdazn

+1

@rxdazn güzel yakalamak! Bir yan not olarak –

+1

, ayrıca range() '$ find = range (" a "," z "); – HamZa