Как получить ссылки не с сайта с помощью php и регулярного выражения

Я хочу добавить rel="nofollow" во все ссылки на моем веб-сайте, если ссылки ведут на другой веб-сайт.

Например,

$str = "<a href='www.linktoothersite.com'>I swear this isn't spam!</a><br><a href='www.mywebsite.com'>Hello World</a>";

Результат должен быть

$str = "<a href='www.linktoothersite.com' rel="nofollow">I swear this isn't spam!</a><br><a href='www.mywebsite.com'>Hello World</a>";

Я действительно хочу регулярное выражение, но не DDOMDocument. Потому что, когда я использую DOMDocument, я всегда получаю сообщение об ошибке "Предупреждение: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: ожидание ';' в сущности"


person Community    schedule 24.06.2011    source источник
comment
возможный дубликат Как программно добавить rel=external к внешним ссылкам в строке HTML?   -  person mario    schedule 25.06.2011
comment
не анализируйте html с помощью регулярных выражений. вместо этого используйте DOMDocument.   -  person dqhendricks    schedule 25.06.2011


Ответы (1)


Используйте синтаксический анализатор DOM и переберите все ссылки, проверяя их атрибут href для других сайтов. Это не проверено и может потребовать некоторой настройки.

// assuming your html is in $HTMLstring
$dom = new DOMDocument();
$dom->loadHTML($HTMLstring);

// May need to disable error checking if the HTML isn't fully valid
$dom->strictErrorChecking = FALSE;

// Get all the links
$links = $dom->getElementsByTagName("a");
foreach($links as $link) {
  $href = $link->getAttribute("href");

  // Find out if the link points to a domain other than yours
  // If your internal links are relative, you'll have to do something fancier to check
  // their destinations than this simple strpos()
  if (strpos("yourdomain.example.com", $href) == -1) {
     // Add the attribute
     $link->setAttribute("rel", "nofollow");
  }

// Save the html
$output = $dom->saveHTML;
person Michael Berkowski    schedule 24.06.2011
comment
Я всегда получал предупреждение: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: ожидается ';' в Entity, когда я использую $dom-›loadHTML. Какие-либо предложения? - person ; 25.06.2011
comment
Похоже, вы передаете ему недопустимый HTML, где-то отсутствует точка с запятой в объекте, таком как &amp. Либо убедитесь, что HTML действителен, либо также попробуйте установить $dom->strictErrorChecking = FALSE, чтобы он пропускал больше этих проблем. - person Michael Berkowski; 25.06.2011