Metin ile belirli bir etki alanı bağlantıları yerine (PHP)

2 Cevap php

I var:

<a href="http://abc.com">Title</a>

Ve:

<a href="http://xyz.com">Title</a>

Ben "Başlık" metin bağlantısını değiştirmek istiyorsanız, ancak gelen http://abc.com. Ama nasıl (Google'ı denedim), benim için açıklayabilir bilmiyorum. PHP iyi değilim.

Şimdiden teşekkürler.

2 Cevap

Emin değil ben gerçekten soruyorsun anlamak, ancak eğer:

  • Bazı HTML içeren bir dize var
  • ve bazı metin ile abc.com tüm bağlantıları değiştirmek istiyor

Özellikle sen DOMDocument sınıfına bir göz atın, ve onun için - Sonra, iyi bir çözüm (better than regular expressions, should I say !) DOM ile ilgili sınıfları kullanmak olacaktır loadHTML yöntemi.


For example, considering that the HTML portion is declared in a variable :

$html = <<<HTML
<p>some text</p>
<a href="http://abc.com">Title</a>
<p>some more text</p>
<a href="http://xyz.com">Title</a>
<p>and some again</p>
HTML;


You could then use something like this :

$dom = new DOMDocument();
$dom->loadHTML($html);
$tags = $dom->getElementsByTagName('a');
for ($i = $tags->length - 1 ; $i > -1 ; $i--) {
    $tag = $tags->item($i);
    if ($tag->getAttribute('href') == 'http://abc.com') {
        $replacement = $dom->createTextNode($tag->nodeValue);
        $tag->parentNode->replaceChild($replacement, $tag);
    }
}
echo $dom->saveHTML();


And this would get you the following portion of HTML, as output :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>some text</p>
Title
<p>some more text</p>
<a href="http://xyz.com">Title</a>
<p>and some again</p>
</body></html>


Note that the whole <a href="http://abc.com">Title</a> portion has been replaced by the text it contained.

Yerine başka bir metin isterseniz ben $tag->nodeValue kullanılan yerlerde, sadece Kaldırılan düğümün geçerli içerik olduğu, kullanabilirsiniz.

Ne yazık ki, evet, bu doctype beyanı, <html> ve <body> etiketleri de dahil olmak üzere, tam bir HTML belgesi oluşturur ...

Başka yorumlanır kasayı için:

$string = '<a href="http://abc.com">Title</a> <a href="http://xyz.com">Title</a>';
$pattern = '/\<\s?a\shref[\s="\']+([^\'"]+)["\']\>([^\<]+)[^\>]+\>/';
$result = preg_replace_callback($pattern, 'replaceLinkValueSelectively', $string);

function replaceLinkValueSelectively($matches)
{
    list($link, $URL, $value) = $matches;

    switch ($URL)
    {
        case 'http://abc.com':
            $newValue = 'New Title';
            break;

        default:
            return $link;
    }

    return str_replace($value, $newValue, $link);        
}

echo $result;

giriş

<a href="http://abc.com">Title</a> <a href="http://xyz.com">Title</a>

olur

<a href="http://abc.com">New Title</a> <a href="http://xyz.com">Title</a>

$string is your giriş, $result is your giriş modified. You can define more URLs as cases. Please note: I wrote that regular expression hastily, and I'm quite the novice. Please check that it suits all your intended cases.