2012-11-23 14 views
6

के साथ बात करें मैं एक वेबपृष्ठ को लीट (1337) में बदलना चाहता हूं, XPath और PHP के साथ बात करें।एचटीएमएल टेक्स्ट को लीट में कनवर्ट करें (1337) XPath

यह केवल PHP के साथ किया जा सकता है लेकिन फिर 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 चयनकर्ता टेक्स्ट() के साथ XPath और PHP के साथ किया जा सकता है? उदाहरण ($ HTML वेबपेज है):

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

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

मुझे लगता है कि 'टेक्स्ट()' आपके पृष्ठ में सभी टेक्स्ट लौटाएगा लेकिन आप इसे अपडेट करने में सक्षम नहीं होंगे .. – j0k

+0

जावास्क्रिप्ट के साथ ऐसा करना मेरी राय के कारण और अधिक मजेदार होगा, तो आप एक बुकमार्कलेट बना सकते हैं या कुछ और। –

उत्तर

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> के वंशज होने वाले पाठ को प्रतिस्थापित करेगा। संभवतः संभावित शैलियों, जावास्क्रिप्ट को बदलना नहीं चाहते हैं और आप क्या हैं। ;-)


एक तरफ ध्यान दें पर: मैं खोज और बदल पात्रों में से अपनी सरणियों के साथ इस परीक्षण किया है, लेकिन वहाँ कुछ गड़बड़ उन लोगों के साथ चल रहा है, कि मैं समझ नहीं कर सकते हैं। प्रतिस्थापन वर्ण हर समय पाए गए वर्णों के साथ लाइन नहीं लगते हैं। मुझे नहीं पता कि वह क्यों है।

मैं मेरे लिए सरणियों, और इन काम निर्मित किया है:

$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" पहली सरणी में समस्या थी, जिसे मैंने पूरी तरह से अनदेखा कर दिया क्योंकि आप मेरे पुनर्निर्मित सरणी से देख सकते हैं (मैंने प्रतिलिपि $ $ प्रतिलिपि, उद्धरण प्रतिस्थापित किया, और लीट वर्णों में भर दिया)।

+5

'" j "।" K "यहां पहली सरणी में क्या गलत है – rxdazn

+1

@rxdazn अच्छा पकड़! –

+1

एक साइड नोट के रूप में, आप रेंज() '$ find = range (" a "," z ") का भी उपयोग कर सकते हैं;' – HamZa

संबंधित मुद्दे