मैं PHP के साथ अपने एचटीएमएल आउटपुट में कक्षा के नाम जोड़ने का एक तरीका जानने का प्रयास कर रहा हूं।

इनपुट:

<div class="clsA">
  <div>
    <div class="clsB">
      Content (can be anything including clsA, clsB etc.)
    </div>
  </div>
</div>

या

<div class="clsC">
  <div class="clsB">
      Content (can be anything including clsC, clsB etc.)
  </div>
</div>

और मुझे आउटपुट चाहिए

<div class="clsA myClass">
  <div>
    <div class="clsB clsInner">
      Content (can be anything including clsA, clsB etc.)
    </div>
  </div>
</div>

<div class="clsC myClass">
  <div class="clsB clsInner">
      Content (can be anything including clsC, clsB etc.)
  </div>
</div>

रूट क्लास के लिए, मैं एक क्लास का नाम डालना चाहता हूं और एक निर्दिष्ट क्लास नाम के साथ दूसरे डिव के लिए, मैं एक और क्लास का नाम जोड़ना चाहता हूं। लेकिन मैं तीसरे पक्ष के पुस्तकालय का उपयोग किए बिना उन्हें जोड़ने का कोई तरीका नहीं समझ सका।

मूल रूप से छद्म कोड के रूप में

- Add myClass to the root element
- Add clsInner to the first child element of the root with class name clsB.

नोट: मैं clsB को "clsB clsInner" से प्रतिस्थापित नहीं कर सकता, क्योंकि सामग्री के अंदर clsB के साथ अन्य वर्ग भी हैं।

2
MeCe 17 जुलाई 2018, 18:13
1
हाँ, क्षमा करें, मुझे इसे PHP के साथ करने की ज़रूरत है।
 – 
MeCe
17 जुलाई 2018, 18:16
ठीक है, यह चीजों को साफ़ करने में मदद करता है। क्या आप कोई उदाहरण प्रदान कर सकते हैं कि आपने अब तक क्या प्रयास किया होगा?
 – 
IncredibleHat
17 जुलाई 2018, 18:16
आउटपुट बफ़रिंग का उपयोग करें और इससे पहले कि आप अंत में पृष्ठ को प्रस्तुत करें कुछ DOM हेरफेर करें
 – 
Professor Abronsius
17 जुलाई 2018, 18:16
मैंने DOMDocument का उपयोग करने का प्रयास किया लेकिन मैं सफल नहीं हो सका। एचटीएमएल आउटपुट बफरिंग के साथ प्राप्त होता है और इसे संशोधित करने के लिए PHP के साथ एक रास्ता तलाश रहा है।
 – 
MeCe
17 जुलाई 2018, 18:17
क्या यह कोई व्यायाम है जो आपको कक्षा में करना है ? क्या <div class="clsC <?= "myClass" ?>"> काम कर सकते हैं ?
 – 
Zyigh
17 जुलाई 2018, 18:19

3 जवाब

सबसे बढ़िया उत्तर

PHP से बहुत परिचित नहीं हैं, लेकिन क्या यह काम करेगा?

$dom = new DOMDocument;
$dom->loadHTML($html);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $div) {
        $div->setAttribute('class', $div->getAttribute('class').' myclass');
}
$html = $dom->saveHTML();
4
Greg 17 जुलाई 2018, 18:24
मूल रूप से छद्म कोड के रूप में - myClass को मूल तत्व में जोड़ें - क्लास नाम clsB के साथ रूट के पहले चाइल्ड एलिमेंट में clsInner जोड़ें।
 – 
MeCe
17 जुलाई 2018, 18:45

जैसा कि मुझे पता है, DOMDocument के साथ वर्ग द्वारा एक तत्व प्राप्त करने के लिए, हमें DOMXpath() का भी उपयोग करने की आवश्यकता है।

तो आप यह कोशिश कर सकते हैं:

<?php
$input = '<div class="clsA">
  <div>
    <div class="clsB">
      Content (can be anything including clsA, clsB etc.)
    </div>
  </div>
</div>';

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($input);
libxml_use_internal_errors(false);

$xpath = new DOMXpath($dom);
foreach($xpath->evaluate('//div[contains(@class, "clsA")]') as $clsA) {
    $clsA->setAttribute('class',$clsA->getAttribute('class').' myClass');
}
foreach($xpath->evaluate('//div[contains(@class, "clsB")]') as $clsB) {
    $clsB->setAttribute('class',$clsB->getAttribute('class').' clsInner');
}

echo $dom->saveXML($dom);
?>
1
stckvrw 17 जुलाई 2018, 18:48
वर्ग के नाम केवल उदाहरण थे। आप माता-पिता और बाल तत्वों को खोजने के लिए //div और //div/div को xpath क्वेरी के रूप में उपयोग कर सकते हैं।
 – 
Greg
17 जुलाई 2018, 18:58

यह मानते हुए कि मैं सही ढंग से समझ गया हूं और सामग्री के किसी भी तरह से उत्पन्न होने के बाद आप डीओएम को संशोधित करना चाहते हैं लेकिन क्लाइंट को इसे देखने से पहले आप output buffering, DOMDocument और DOMXPath का उपयोग कर सकते हैं। सामग्री के साथ छेड़छाड़ करें, हालांकि सामग्री को अंततः प्रस्तुत करने से पहले आप फिट देखते हैं। नीचे दिए गए कोड का परिणाम देखने के लिए जब आप इसे चलाते हैं तो आपको पृष्ठ के स्रोत कोड को देखना होगा (यदि आप इसे "जैसा है" चलाते हैं)

<?php

    $outerClassName='myClass';
    $innerClassName='clsInner';

    $attrib='class';

    ob_start();
?>

<html>
    <head>
        <title>Manipulating the output</title>
    </head>
    <body>
        <div class="clsA">
          <div>
            <div class="clsB">
              Content (can be anything including clsA, clsB etc.)
            </div>
          </div>
        </div>

        <div class="clsC">
          <div class="clsB">
              Content (can be anything including clsC, clsB etc.)
          </div>
        </div>
    </body>
</html>
<?php
    $dom=new DOMDocument;
    $dom->loadHTML( ob_get_contents() );
    $xp=new DOMXPath( $dom );
    $col = $xp->query( '//div' );



    if( $col->length > 0 ){
        foreach( $col as $node ){

            if( !stristr( $node->getAttribute( $attrib ), $outerClassName ) ) {
                $children=$xp->query( 'div', $node );

                if( $children->length > 0 ){
                    if( $node->hasAttribute( $attrib ) ) $node->setAttribute( $attrib, trim( $node->getAttribute( $attrib ) . ' ' . $outerClassName ) );
                } else {
                    if( $node->hasAttribute( $attrib ) ) $node->setAttribute( $attrib, trim( $node->getAttribute( $attrib ) . ' ' . $innerClassName ) );
                }
            }
        }
        ob_clean();
        echo $dom->saveHTML();
    }


    $dom = $xp = $col = $children = null;
    ob_end_flush();
?>
0
Professor Abronsius 17 जुलाई 2018, 19:01