• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Regex src= bei URL prüfen

D

DiVaO

Guest
Moin,

ich hab in meinem Forum eine Funktion eingebaut, die dafür sorgt, dass gepostete URL's in klickbare Links mit de Titel der jeweiligen Seite umgewandelt werden.

PHP:
$text = strip_tags($text);
$pattern = '/(((ht|f)tp(s?):\/\/)|(www\.[^ \[\]\(\)\n\r\t]+)|(([012]?[0-9]{1,2}\.){3}[012]?[0-9]{1,2})\/)([^ \[\]\(\),;"\'<>\n\r\t]+)([^\. \[\]\(\),;"\'<>\n\r\t])|(([012]?[0-9]{1,2}\.){3}[012]?[0-9]{1,2})/i';

$text = preg_replace_callback($pattern,create_function('$matches','return getUrlTitle($matches[0]);'), $text);
return $text;

Die Funktion getUrlTitle findet dann den Titel der Seite heraus und erzeugt den klickbaren Link (<a href='.$url.' target=_blank>'.$title.'</a>)

Das ist ein Teil der Funktion. Funktioniert soweit einwandfrei, nur habe ich ein Problem. Die Funktion wandelt alle URLs in HTML-Tags um, aber leider nicht nur die, die einfach so gepostet werden, sondern alle.

HTML:
<img src='http://bla.de' />

Die Funktion macht auch hier einen klickbaren Link aus der URL, womit das Bild natürlich nichtmehr dargestellt wird... das gleiche bei eingebetteten Videos, etc.
Nun meine Frage: Ist es möglich das Pattern bzw. die Funktion so anzupassen, dass er nur die URLs umwandelt, die alleine stehen und kein src=' oder src=" davor haben ? Das würde mein Problem lösen.

Danke schonmal.
 
PHP:
if(!strist($text,"src="))
{
  $text = preg_replace_callback($pattern,create_function('$matches','return getUrlTitle($matches[0]);'), $text);  
}
return $text;
 
Du musst in dein Pattern:
PHP:
$pattern = '/(((ht|f)tp(s?):\/\/)|(www\.[^ \[\]\(\)\n\r\t]+)|(([012]?[0-9]{1,2}\.){3}[012]?[0-9]{1,2})\/)([^ \[\]\(\),;"\'<>\n\r\t]+)([^\. \[\]\(\),;"\'<>\n\r\t])|(([012]?[0-9]{1,2}\.){3}[012]?[0-9]{1,2})/i';

Am Anfang und am Ende das Leerzeichen zufügen, damit du nur die Links rausfischt, die alleine stehen.
 
Falls etwas unklar ist, bitte gezielte Nachfragen stellen.

PHP:
<?php

/**
 * Send a GET requst using cURL
 *
 * @see http://www.php.net/manual/en/function.curl-exec.php#98628
 *
 * @param string $url to request
 * @param array $get values to send
 * @param array $options for cURL
 * @return string
 */
function curlx_get($url, array $get = NULL, array $options = array())
{
    if ($get === null) {
        $get = array();
    }

    $defaults = array(
        CURLOPT_URL            => $url . (strpos($url, '?') === FALSE ? '?' : '') . http_build_query($get),
        CURLOPT_HEADER         => 0,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT        => 2,
        CURLOPT_FOLLOWLOCATION => TRUE,
        CURLOPT_MAXREDIRS      => 5
    );

    $ch = curl_init();
    curl_setopt_array($ch, ($options + $defaults));
    if (!$result = curl_exec($ch)) {
        throw new Exception(curl_error($ch));
    }
    curl_close($ch);

    return (string) $result;
}

/**
 * @see http://www.php.net/manual/en/class.domelement.php#86803
 */
function domx_getInnerHtml($elem)
{
    $innerHtml = '';

    foreach ($elem->childNodes as $child) {
        $tmp_doc = new DOMDocument();
        $tmp_doc->appendChild($tmp_doc->importNode($child,true));
        $innerHtml .= $tmp_doc->saveHTML();
    }

    return $innerHtml;
}

/**
 *
 * @param Closure $fetchFunction
 * @param string $threadId
 * @return string
 */
function getPageTitle(Closure $fetchFunction, $url)
{
    $htmlCode = '';

    try {
        $htmlCode = $fetchFunction($url);
    } catch (Exception $e) {
        return $url;
    }

    if ($htmlCode === '') {
        return 'Unknown page title';
    }

    // Suppress "invalid markup" warnings
    libxml_use_internal_errors(true);

    $doc = new DOMDocument();
    $doc->loadHTML($htmlCode);
    $xpath = new DOMXPath($doc);

    $title = '';

    foreach ($xpath->query('//title') as $node) {
        $title = domx_getInnerHtml($node);
    }

    $title = html_entity_decode(trim($title), ENT_QUOTES, 'UTF-8');
    $title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

    return $title;
}

/**
 *
 * @param string String with plain text links
 * @return string String with HTML links
 */
function linkify($text)
{
    $pattern = '/(((ht|f)tp(s?):\/\/)|(www\.[^ \[\]\(\)\n\r\t]+)
            |(([012]?[0-9]{1,2}\.){3}[012]?[0-9]{1,2})\/)
            ([^ \[\]\(\),;"\'<>\n\r\t]+)([^\. \[\]\(\),;"\'<>\n\r\t])
            |(([012]?[0-9]{1,2}\.){3}[012]?[0-9]{1,2})/ix';

    $fetchFunction = function ($url) {
        #return file_get_contents($url); // Falls möglich
        return curlx_get($url);
    };

    $text = preg_replace_callback($pattern, function ($matches) use ($fetchFunction) {
        $title = getPageTitle($fetchFunction, $matches[0]);
        return '<a href="'.$matches[0].'">' . $title . '</a>';
    }, $text);

    return $text;
}

error_reporting(-1);
ini_set('display_errors', 1);

header('Content-Type: text/html; charset=UTF-8');

$data = <<<EOT
<a href="http://example.org/do-not-change">Link</a>
http://www.arduino.cc/
<ul>
    <li><a href="http://example.org/do-not-change">Link</a></li>
    <li>http://www.ermshaus.org/</li>
</ul>
http://www.html.de/ a

http://www.zeit.de/
EOT;

$doc = new DOMDocument('1.0', 'UTF-8');

// XML braucht ein eindeutiges Root-Element
$doc->loadXML('<root>' . $data . '</root>');

echo '<h2>Original</h2>';
echo '<pre>' . htmlspecialchars($doc->saveHTML(), ENT_QUOTES, 'UTF-8') . '</pre>';

$xpath = new DOMXPath($doc);

$nodes = $xpath->query('//text()');

foreach ($nodes as $node) {
    $f = $doc->createDocumentFragment();
    $f->appendXML(linkify($node->nodeValue));
    $node->parentNode->replaceChild($f, $node);
}

echo '<h2>Processed</h2>';
echo '<pre>' . htmlspecialchars($doc->saveHTML(), ENT_QUOTES, 'UTF-8') . '</pre>';

// Root-Element entfernen:

$finalCode = substr(trim($doc->saveHTML()), 6, -7);

echo '<h2>Final</h2>';
echo '<pre>' . htmlspecialchars($finalCode, ENT_QUOTES, 'UTF-8') . '</pre>';
 
Zurück
Oben