Заменить ссылки из определенного домена на текст (PHP) - PullRequest
0 голосов
/ 25 апреля 2010

у меня есть:

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

А:

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

Я хочу заменить ссылку на текст «Заголовок», но только с http://abc.com. Но я не знаю, как (я попробовал Google), можете ли вы объяснить для меня. Я не очень хорош в PHP.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 25 апреля 2010

Не уверен, что я действительно понимаю, о чем вы спрашиваете, но если вы:

  • Есть строка, которая содержит HTML
  • и хотите заменить все ссылки на abc.com каким-либо текстом

Тогда, хорошее решение (лучше, чем регулярные выражения, я бы сказал!) будет использовать классы, связанные с DOM - особенно, вы можете взглянуть на DOMDocument класс и его loadHTML метод.


Например, учитывая, что часть HTML объявлена ​​в переменной:

$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;


Затем вы можете использовать что-то вроде этого:

$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();


И в результате вы получите следующую порцию HTML:

<!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>


Обратите внимание, что вся часть <a href="http://abc.com">Title</a> была заменена содержащимся в ней текстом.

Если вам нужен какой-то другой текст, просто используйте его там, где я использовал $tag->nodeValue, который является текущим содержимым удаляемого узла.

К сожалению, да, генерируется полный HTML-документ, включая объявление doctype, теги <html> и <body>, ...

1 голос
/ 25 апреля 2010

Для покрытия другого интерпретируемого случая:

$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;

ввод

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

становится

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

$ string - ваш ввод, $ result - ваш ввод изменен. Вы можете определить больше URL-адресов в качестве случаев. Обратите внимание: я написал это регулярное выражение наспех, и я довольно новичок. Пожалуйста, проверьте, что он подходит для всех ваших предполагаемых случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...