2012-11-23 15 views
6

我想將網頁轉換爲leet(1337)與XPath和PHP交談。將HTML文本轉換爲Leet(1337)與XPath交談

它可以只用PHP來完成,但HTML節點也可以用leet說出來。

例($ HTML是網頁):

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

這也將替換HTML節點。

這可以用XPath和PHP來完成,XPath選擇器text()?例如($ HTML是網頁):

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

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

我認爲'text()'會返回頁面中的所有文本,但是你將無法在更新之後更新它.. – j0k

+0

用JavaScript做這件事在我看來會更有趣因爲你可以製作一個書籤或者其他的東西。 –

回答

3

試試這個:

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

請注意,這可能是你需要一個更有用的XPath查詢:

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

...因爲這隻會取代<head><title>中的文字或者文字是<body>的後代。可能不想替換可能的樣式,Javascript和你有什麼。 ;-)


在一個側面說明:我同意你的查找和替換的字符數組測試這一點,但有什麼東西不對勁他們,我想不通。替換角色似乎並不總是與找到的角色對齊。我不知道這是爲什麼。

我已經重新創建陣列,而這些工作對我來說:

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

我只是不明白,爲什麼你陣列爲我工作。 : - /可能是一個編碼問題?如果有人想加入猜測,請做。

編輯:正如rxdazn注意到的,"j"."k"是第一個數組中的問題,我完全忽略了你可以從我的重新創建的數組中看到(我複製$ find到$ repl,替換引號並填充leet字符)。

+5

''j「。」k「'這裏第一個數組有什麼不對嗎 – rxdazn

+1

@rxdazn很棒! –

+1

作爲一個附註,你也可以使用range()'$ find = range(「a」,「z」);'' – HamZa