2012-11-23 27 views
6

Tôi muốn biến trang web thành leet (1337) nói với XPath và PHP.Chuyển đổi văn bản HTML thành Leet (1337) Nói chuyện với XPath

Nó có thể được thực hiện chỉ với PHP nhưng sau đó các nút HTML cũng được thay thế bằng leet nói.

Ví dụ ($ html là trang web):

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

Đó cũng thay thế các nút HTML.

Điều này có thể được thực hiện với XPath và PHP với bộ chọn XPath văn bản()? Ví dụ ($ html là trang web):

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

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

Tôi nghĩ 'văn bản()' sẽ trả về tất cả văn bản trong trang của bạn nhưng bạn sẽ không thể cập nhật nó sau .. – j0k

+0

Làm điều này với javascript sẽ thú vị hơn nhiều theo ý kiến ​​của tôi thì bạn có thể tạo một bookmarklet hay gì đó. –

Trả lời

3

Hãy thử điều này:

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

Lưu ý rằng đây có lẽ là một truy vấn xpath hữu ích hơn cho nhu cầu của bạn:

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

... vì điều này sẽ chỉ thay thế văn bản trong <head><title> hoặc văn bản là hậu duệ của <body>. Có lẽ sẽ không muốn thay thế các phong cách có thể, Javascript và những gì có bạn. ;-)


Lưu ý: Tôi đã thử nghiệm với mảng của bạn tìm và thay thế các ký tự, nhưng có điều gì đó đang xảy ra với chúng mà tôi không thể tìm ra. Các nhân vật thay thế dường như không phù hợp với các nhân vật được tìm thấy mọi lúc. Tôi không biết tại sao lại thế.

tôi đã tái tạo các mảng, và những công việc cho tôi:

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

Tôi chỉ không thể hiểu tại sao mảng của bạn là không làm việc cho tôi. : -/Có lẽ một vấn đề mã hóa? Nếu ai muốn kêu vang và mạo hiểm đoán, làm ơn.

Edit: Theo rxdazn nhận thấy, "j"."k" là vấn đề trong mảng đầu tiên, mà tôi hoàn toàn bị bỏ qua như bạn có thể nhìn thấy từ mảng tái tạo của tôi (tôi sao chép $ find hơn đến $ repl, thay thế dấu ngoặc kép, và điền vào các ký tự bổ sung thêm các).

+5

'" j "." K "' đây là những gì sai trong mảng đầu tiên – rxdazn

+1

@rxdazn bắt tốt đẹp! –

+1

là một lưu ý phụ, bạn cũng có thể sử dụng dải ô() '$ find = range (" a "," z ");' – HamZa