Как перехватить ссылки href и заменить их через PHP - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть переменная php с некоторым содержанием html и некоторыми ссылками href.Мне нужно захватить эти ссылки, сохранить их в БД и заменить их идентификатором строки, которую я только что сохранил (чтобы отслеживать, сколько людей переходит по этой ссылке в приложении для рассылки новостей).

В основном мне нужновыполните 2 функции в примере (some_function_to_save_the_links_to_array и some_function_to_save_the_links_to_array).

Большое спасибо за вашу помощь!

Пример:

$var = "<html><body><h1>This is the newsletter</h1><p>Here I have <a href='http://www.google.com'>Some links</a> in the body of this <a href='http://www.yahoo.com'>Newsletter</a> and I want to extract their.</body></html>";
//Here I just no know how to do this, but I need to save http://www.google.com and http://www.yahoo.com to, maybe, an array, and save this array in a mysql db.
some_function_to_save_the_links_to_array;
while (THERE ARE VALUES IN THE ARRAY OF THE LINKS){
 save $array['X'] to db //(I already know how to do it, this is not the problem)
 $id = last inserted row in db //I know how to do it also
 function_to_replace_the_links_for_the_id;
}
echo $var;

And this is the echo:
<html><body><h1>This is the newsletter</h1><p>Here I have <a href='http://www.mysite.com/link.php?id=1'>Some links</a> in the body of this <a href='http://www.mysite.com/link.php?id=1'>Newsletter</a> and I want to extract their.

Ответы [ 2 ]

1 голос
/ 10 февраля 2012
<?php
function captureLink($content) 
{
    $links = array();
    $pattern = "/<a\s+href=[\"\']([^>]+?)[\"\']/iU";
    if(preg_match_all($pattern,$content,$matches)) {
        for($i = 0;$link = $matches[$i][1];$i++)
            array_push($links,$link);
    }
    return $links;
}

function insertLinksToDb(array $links)
{
    $linksDb = array();
    foreach($links as $link) {
        $hash_link = md5($link);
        $sql = "SELECT (id) FROM links WHERE hash LIKE :hash";
        $sth = $dbh->prepare($sql);
        $sth->bindValue(':hash',$hash_link,PDO::PARAM_STR);
        $sth->execute();
        $result = $sth->fetch(PDO::FETCH_ASSOC);
        if(!empty($result)) {
            $id = $result['id'];
            $linksDb[$id] = $link;
        } else {
            $sql = " INSERT INTO links (hash,link) VALUES(:hash,:link);";
            $sth = $dbh->prepare($sql);
            $sth->execute(array(':hash'=>$hash_link,':link',$link));
            $linksDb[PDO::lastInsertId] = $link;
        }
    }
    return $linksDb;
}

function normallizeLinks($content,array $links)
{
    foreach($links as $id => $link) {
        //str_replace working faster than strtr
        $content = str_replace($link,'/links.php?id='.$id,$content);
    }
    return $content;
}
1 голос
/ 10 февраля 2012

Есть несколько способов сделать это, но я бы сделал это так, как вы просматриваете HTML. Я помогу вам начать, и вы можете закончить это отсюда:

$string = "<html><body><h1>This is the newsletter</h1><p>Here I have <a href='http://www.google.com'>Some links</a> in the body of this <a href='http://www.yahoo.com'>Newsletter</a> and I want to extract their.</body></html>";

$dom = new DOMDocument(); // init 
$dom->loadHTML($string);

$anchors = $DOM->getElementsByTagName('a');
// Traverse anchors
foreach($anchors as $anchor) {
   // Do your magic for saving to the database here
   $anchor->getAttribute('href'); // This would get the value of the href
   $textNode = $anchor->childNodes->item(0)->nodeValue; // This would be the anchor text
   $textNode = 'My new text';
}

Это, вероятно, не сработает, если вы скопируете и вставите его, давным-давно я работал с обходом HTML / XML в PHP.

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