Использование regexp для получения всех ссылок href, кроме базовой href - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь получить все ссылки html в строке и заменить их, используя preg_replace, на другую ссылку (для отслеживания ссылок и т. Д.)

Отлично работает на ссылках типа http://www.facebook.com, но не на тех, у которых нет 'www' в строке. Таким образом, первый URL будет в порядке, но последний не будет работать - кто-нибудь может подсказать, как я могу изменить свое выражение, чтобы дать ОБА подобным ссылкам возможность работать.

http://www.twitter.com
http://twitter.com/myusername

$message = preg_replace("/<a([^>]+)href=\"http\:\/\/([a-zA-Z0-9\-]+\.[a-zA-Z0-9]+\.[a-zA-Z]{2,3}(\/*)?)/", "<a$1href=\"http://www.site.com/system/link_tracker.php?URL=$2&ID={$ID}\"", $message);

Ответы [ 3 ]

1 голос
/ 03 апреля 2012

http://([a -zA-Z0-9 -..] + [A-Za-Z0-9] + [A-Za-Z] {2,3} (/ *)

Это ни в коем случае не регулярное выражение URL. Это может работать в двух или трех случаях, но вы игнорируете существование:

Пользователям особенно не понравится последнее, потому что, когда они ссылаются на какой-либо сайт, эта ссылка становится недействительной с помощью вашего регулярного выражения. Используйте общий способ, например DOMDocument.replaceChild(), чтобы изменить ссылки в документе HTML (который, как я полагаю, вы используете, так как вы захватываете URL-адреса в тегах <a>).

Как сказано в этого ответа , это можно сделать с помощью чего-то подобного, не проверенного:

$dom = new DOMDocument();  
$html = @$dom->load(...); // Load your html
$links = $dom->getElementsByTagName('a'); 

foreach ($links as $link)
{
    // Store original node
    $origLink = $link;

    // Find original href
    $href = $link->getAttribute('href');

    // Replace link
    $href = "http://www.site.com/system/link_tracker.php?URL=" . urlencode($href) . "&ID={$ID}";

    // Replace href
    $link->setAttribute('href', $href);

    // Replace child (don't know if this is required because you already alter $link)
    $dom->replaceChild($link, $origLink);

}   
0 голосов
/ 03 апреля 2012

В качестве регулярного выражения я бы попробовал следующее:

/<a([^>]+href=\"http:\/\/([^\"]+?)\"/

Это будет захватывать все, что задано как «аргумент» href, если (x) html href заключен в двойные кавычки. Чтобы использовать это как часть другого URL, вы хотели бы закодировать символ как? и & во избежание их интерпретации как части вашего URL

0 голосов
/ 03 апреля 2012
$message = preg_replace("/<a([^>]+)href=\"http\:\/\/((?:[a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,3}(\/*)?)/", "<a$1href=\"http://www.site.com/system/link_tracker.php?URL=$2&ID={$ID}\"", $message);

Будет работать на http://twitter.com и http://www.abcd.gov.edu.ua.sub.sub.domain.com

...