PHP Reg ex для анализа ссылки - PullRequest
1 голос
/ 21 ноября 2010

У меня есть PHP-скрипт, который анализирует содержимое POST формы (сообщения) и преобразует любой URL в реальную ссылку HTML.Это два регулярных выражения, которые я использую:

$dbQueryList['sb_message'] = preg_replace("#(^|[\n ])([\w]+?://[^ \"\n\r\t<]*)#is", "\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $dbQueryList['sb_message']);

$dbQueryList['sb_message'] = preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r<]*)#is", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $dbQueryList['sb_message']);

Хорошо, это работает хорошо, но сейчас, в другом сценарии, я хотел бы сделать обратное.Так что в моем $dbQueryList['sb_message'] я мог бы иметь ссылку типа "<a href="http://google.com" target="_blank">Google</a>", и я хотел бы просто иметь "http://google.com".

Я не могу написать регулярное выражение, которое может это сделать.Не могли бы вы мне помочь, пожалуйста?Спасибо:)

Ответы [ 2 ]

1 голос
/ 21 ноября 2010

Безопаснее использовать DOMDocument вместо регулярных выражений для анализа содержимого HTML.

Попробуйте этот код:

<?php

function extractAnchors($html)
{
    $dom = new DOMDocument();
    // loadHtml() needs mb_convert_encoding() to work well with UTF-8 encoding
    $dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"));

    $xpath = new DOMXPath($dom);

    foreach ($xpath->query('//a') as $node)
    {
        if ($node->hasAttribute('href'))
        {
            $newNode = $dom->createDocumentFragment();
            $newNode->appendXML($node->getAttribute('href'));
            $node->parentNode->replaceChild($newNode, $node);
        }
    }

    // get only the body tag with its contents, then trim the body tag itself to get only the original content
    return mb_substr($dom->saveXML($xpath->query('//body')->item(0)), 6, -7, "UTF-8");
}

$html = 'Some text <a href="http://www.google.com">Google</a> some text <img src="http://dontextract.it" alt="alt"> some text.';
echo extractAnchors($html);
1 голос
/ 21 ноября 2010

Как-то так я думаю:

echo preg_replace('/<a href="([^"]*)([^<\/]*)<\/a>/i', "$1", 'moofoo <a href="http://google.com" target="_blank"> Google </a> helloworld');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...