Düzenli ifade kullanarak bir etiket ve içeriğini kaldırmak için nasıl?

4 Cevap php
$str = 'some text <MY_TAG> tag <em>contents </em> </MY_TAG> more text ';

My questions are: How to retrieve content tag <em>contents </em> which is between <MY_TAG> .. </MY_TAG>?

Ve

Kaldırma <MY_TAG> ve onun içeriği $str?

Ben PHP kullanıyorum.

Teşekkür ederim.

4 Cevap

MY_TAG iç içe olamaz eğer, sonuç almak için bu deneyin:

preg_match_all('/<MY_TAG>(.*?)<\/MY_TAG>/s', $str, $matches)

Ve, bunları kaldırmak yerine preg_replace kullanın.

Bunu yapmak için sadece tam doğru yolu düzenli ifadeler kullanmak olmasa da, size bunu tüm özel davalarını olmaz kabul eğer ne istediğinizi alabilirsiniz:

preg_match("/<em[^>]*?>.*?</em>/i", $str, $match);
// Use this only if you aren't worried about nested tags.
// It will handle tags with attributes

Ve

preg_replace(""/<MY_TAG[^>]*?>.*?</MY_TAG>/i", "", $str);

Bunun için normal ifadeler kullanmak istemiyorum. Bir çok daha iyi bir çözüm DOMDocument içine içeriğini yüklemek ve DOM ağacı ve standart DOM yöntemlerini kullanarak üzerinde çalışmak olacaktır:

$document = new DOMDocument();
$document->loadXML('<root/>');
$document->documentElement->appendChild(
    $document->createFragment($myTextWithTags));

$MY_TAGs = $document->getElementsByTagName('MY_TAG');
foreach($MY_TAGs as $MY_TAG)
{
    $xmlContent = $document->saveXML($MY_TAG);
    /* work on $xmlContent here */

    /* as a further example: */
    $ems = $MY_TAG->getElementsByTagName('em');
    foreach($ems as $em)
    {
        $emphazisedText = $em->nodeValue;
        /* do your operations here */
    }
}

Kaldırılması için sadece bu kullanarak sona erdi:

$str = preg_replace('~<MY_TAG(.*?)</MY_TAG>~Usi', "", $str);

Sınırlayıcı çözüldü hataları bile kaçan bir sorun gibi görünüyordu bitiş etiketi, çünkü Tersbölünün atılan için / ~ kullanma yerine. Açılış etiketinden> ortadan kaldırarak nitelikleri veya diğer karakterler için izin verir ve hala etiketi ve tüm içeriğini alır.

Yuvalama bir endişe değil nerede bu sadece çalışır.

Usi düzenleyiciler U = Ungreedy demek, s = linebreak karakterleri, i = harf duyarsız.