HTML etiketlerini kaldırmak için regex kullanarak

6 Cevap php

Ben dönüştürmek gerekiyor

$text = 'We had <i>fun</i>. Look at <a href="http://example.com">this phokarşı</a> of Joe';

[Edit] There could be multiple links in the text.

karşı

$text = 'We had fun. Look at this phokarşı (http://example.com) of Joe';

All HTML tags are karşı be removed and the href value from <a> tags needs karşı be added like above.

What would be an efficient way karşı solve this with regex? Any code snippet would be great.

6 Cevap

İlk bağlantısını tutmak için bir preg_replace yapın. Sen kullanabilirsiniz:

preg_replace('<a href="(.*?)">(.*?)</a>', '$\2 ($\1)', $str);

Sonra strip_tags hangi etiketleri kalanını bitirmek olacaktır kullanın.

Sen hiçbir regex dedi, ama onlar burada hayatınızı kolaylaştırmak yok. Sadece bir URL ile eşleşen.

preg_match_all('/href="([^"]+)"/', $text, $m);
$text = str_replace('</a>', ' (' . $m[1][0] . ')', $text);
$text = strip_tags($text);

onun href niteliği ile iç html ve bir etiket var olan herhangi bir etiketi değiştirmek için bir xml ayrıştırıcı deneyin.

http://www.php.net/manual/en/book.domxml.php

DOM çözüm:

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
foreach($xpath->query('//a[@href]') as $node) {
    $textNode = new DOMText(sprintf('%s (%s)',
        $node->nodeValue, $node->getAttribute('href')));
    $node->parentNode->replaceChild($textNode, $node);
}
echo strip_tags($dom->saveHTML());

ve XPath olmadan aynı:

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach($dom->getElementsByTagName('a') as $node) {
    if($node->hasAttribute('href')) {
        $textNode = new DOMText(sprintf('%s (%s)',
            $node->nodeValue, $node->getAttribute('href')));
        $node->parentNode->replaceChild($textNode, $node);
    }
}
echo strip_tags($dom->saveHTML());

Bütün yaptığı bir DomDocument örneğine herhangi bir HTML yük olduğunu. İlk durumda tür XML için SQL gibi bir XPath ifadesi kullanır ve bir href niteliği ile tüm bağlantıları alır. Daha sonra innerHTML bir metin düğümü elemanı ve href niteliğini oluşturur ve bağlantıyı değiştirir. Ikinci versiyonu sadece DOM API ve hiçbir XPath kullanır.

Evet, Regex daha birkaç satır daha var ama bu temiz ve kolay anlaşılır ve ek mantığı eklemek için gerektiğinde size herhangi bir baş ağrısı vermeyecektir.

Ben altdizgenin varyasyonlarını kullanarak bu gibi şeyler yapılır ve yerine ettik. I'd probably use regex today ama bunu bir alternatif istedim:

<i> etiketleri için, ben böyle bir şey yapmak istiyorum:

$text = replace($text, "<i>", "");
$text = replace($text, "</i>", "");

(Benim php gerçekten paslı, yani replace doğru işlev adı olmayabilir - ama fikir ben paylaşıyorum budur.)

<a> etiketi biraz daha zordur. Ancak, bu yapılabilir. Sen <a başlar ve bu > ile biter noktasını bulmak gerekir. Sonra tüm uzunluğu ayıklamak ve kapanış </a> olarak değiştirin

Bu gitmek something gibi olabilir:

$start = strrpos( $text, "<a" );
$end = strrpos( $text, "</a>", $start );
$text = substr( $text,  $start, $end );
$text = replace($text, "</a>", "");

Bu işe eğer (ben yine fikir ben iletişim kurmak istiyorum ne, bilmiyorum. Ben kod parçaları yardımcı umuyoruz ama onlar muhtemelen "kutunun dışında" çalışmıyor. Olası bir sürü böcek de vardır kod parçacıkları) tam uygulanması ve çevreye bağlı

Referans:

Bu çözümleyici ile yapmak da çok kolay:

# available from http://simplehtmldom.sourceforge.net
include('simple_html_dom.php');

# parse and echo
$html = str_get_html('We had <i>fun</i>. Look at <a href="http://example.com">this photo</a> of Joe');

$a = $html->find('a');
$a[0]->outertext = "{$a[0]->innertext} ( {$a[0]->href} )";

echo strip_tags($html);

Ve bu test durumda istediğiniz kod üretir.