HTML Link Etiketler Düzenli İfade

5 Cevap php

Düzenli ifadeler ile yardıma ihtiyacım var. Ne aradığım böyle link etiketleri arar bir regex olduğunu:

<link rel="stylesheet" href="style.css" type="text/css">

Bakılmaksızın burada href = "" Ben bağlantı etiketi o kadar bakmak ve / Aşağıdaki ile style.css önünde adlı bir değişken $ url koymak istiyorum, konumlandırılmış. Bu style.css önünde http:// veya https:// bulursa, o zaman ben bunun önünde değişken koymak istemiyorum.

Her bağlantı etiketi değiştirilmesini istediğiniz.

5 Cevap

Sen istenen sonucu arşivlemek için böyle preg_replace kullanabilirsiniz:

preg_replace('/(<link\b.+href=")(?!http)([^"]*)(".*>)/', '$1'.$url.'$2$3$4', $html);

Yani bu kodu (varsayarak $ html ve $ url depolanan = 'http://mydomain.com/'):

<link rel="stylesheet" href="style.css" type="text/css">
<link rel="stylesheet" href="style2.css" type="text/css">
<link rel="stylesheet" href="http://google.com/style3.css" type="text/css">
<link rel="stylesheet" href="style4.css" type="text/css">
<link rel="stylesheet" href="https://google.com/style5.css" type="text/css">
<link rel="stylesheet" href="some/path/to/style6.css" type="text/css">

Bu dönüştürülür:

<link rel="stylesheet" href="http://mydomain.com/style.css" type="text/css">
<link rel="stylesheet" href="http://mydomain.com/style2.css" type="text/css">
<link rel="stylesheet" href="http://google.com/style3.css" type="text/css">
<link rel="stylesheet" href="http://mydomain.com/style4.css" type="text/css">
<link rel="stylesheet" href="https://google.com/style5.css" type="text/css">
<link rel="stylesheet" href="http://mydomain.com/some/path/to/style6.css" type="text/css">

Bunun çözümü bir regex kullanarak güzel (ve güvenilir) olmayacak, bunun yerine bir DOM çözümleyici kullanarak ve manipülasyon yöntemlerinden biri ile öznitelik ekleyerek öneriyoruz. Simplehtmldom bakabilirsiniz:

http://simplehtmldom.sourceforge.net/

Örneğin, bu bir göz atın:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html; // Output: <div id="hello">foo</div><div id="world" class="bar">World</div>

Bu nveyamal ifade deneyin:

/(<link.*href=["'])(style.css)(["'].[^>]*>)/gi

Değiştir bölümü gibi görünecektir

\1http://\2\3

veya

$1http://$2$3

Not: Eğer dize alıntı nasıl dayalı tırnak birini kaçmak gerekebilir.

Ben Juicy Scripter cevabı @ uyarlanmıştır.

Bu, aşağıdakiler için bir gelişmedir.

a) it also works for single quotes as well as double quotes. meaning

/**
 *
 * Take in html content as string and find all the <script src="yada.js" ... >
 * and add $prepend to the src values except when there is http: or https:
 *
 * @param $html String The html content
 * @param $prepend String The prepend we expect in front of all the href in css tags
 * @return String The new $html content after find and replace. 
 * 
 */
    protected static function _prependAttrForTags($html, $prepend, $tag) {
        if ($tag == 'css') {
            $element = 'link';
            $attr = 'href';
        }
        else if ($tag == 'js') {
            $element = 'script';
            $attr = 'src';
        }
        else if ($tag == 'img') {
            $element = 'img';
            $attr = 'src';
        }
        else {
            // wrong tag so return unchanged
            return $html;
        }
        // this checks for all the "yada.*"
        $html = preg_replace('/(<'.$element.'\b.+'.$attr.'=")(?!http)([^"]*)(".*>)/', '$1'.$prepend.'$2$3$4', $html);
        // this checks for all the 'yada.*'
        $html = preg_replace('/(<'.$element.'\b.+'.$attr.'='."'".')(?!http)([^"]*)('."'".'.*>)/', '$1'.$prepend.'$2$3$4', $html);
        return $html;
    }

Ben tek bir dosyayı düzenlerken tahmin ediyorum - metin editörü veya IDE sizin için yerine / regex arama yapmak gerekir.

Bu deneyin:

Arama: href="([^http].*?)"

Değiştirin: href="<?php echo $url; ?>/\1"

Eğer PHP kullanmak gerekiyorsa, preg_replace kullanın. Sadece arama dizesi ondan önce ve sonra bir eğik ihtiyacı olduğunu unutmayın.