2013-03-28 60 views
0

正則表達式在我的啓動過程中仍然是一塊石頭。你能幫我嗎,夥計?如果是特定的子域,使用preg_match替換CSS文件

我有這段代碼在CMS中掛鉤。實際上它是函數中包含的整個代碼,由主代碼來執行。

if (preg_match('#^/member/helpdesk/index.*#i', $_SERVER['REQUEST_URI'])) //do it only for specific url 
{ 
    $event->replace('#(<h1>Tickets.*</h1>)#i', '$1<div>Some content</div>'); 
} 

但我真正想要的是檢查,如果頁面屬於子域member.site.com,找到<link rel="stylesheet" href="http://site.com/orange.css"/>blue.css

謝謝:)替換orange.css

+0

裝的是什麼地方?我想我們需要看看你使用的是什麼變量,它們包含什麼,以及你希望它們包含什麼。 – FrankieTheKneeMan

+0

@FrankieTheKneeMan就是這樣。這是一個CMS的鉤子。這是函數的整個代碼。我只需要讓它檢測當前頁面是否屬於子域'http:// member.site.com',如果爲true,則用'blue.css'替換'orange.css'。其餘部分將由主代碼執行。 – oscarmarcelo

回答

0

我的意思是,在覈心我認爲你要做到這一點:

$str = '<html><head><link rel="stylesheet" href="http://site.com/style.css"/></head></html>' 
if (preg_match('#member\.site\.com#i'), $_SERVER['HTTP_HOST'])){ 
    $str = preg_replace('#http://site\.com/style\.css#', 'http://site.com/style-member.css', $str); 
} 

但是,也許你應該考慮怎麼不管它是你正在試圖取而代之的是首先產生?也許這是一個可以放在那個位置的支票?另外,如果你打算修改一個html文檔,我強烈建議使用某種解析器。如果你打算做的第一,也許是這樣的:

$head = '<head><link rel="stylesheet" href="http://site.com/style'; 
if (preg_match('#member\.site\.com#i'), $_SERVER['HTTP_HOST'])){ 
    $head .= '-member'; 
} 
$head .= '.css"></head>'; 

但是如果你堅持解析HTML文檔:

$str = '<html><head><link rel="stylesheet" href="http://site.com/style.css"/></head></html>' 
$dom = new DOMDocument(); 
$dom->loadHTML($str); 
if (preg_match('#member\.site\.com#i'), $_SERVER['HTTP_HOST'])){ 
    $links = $dom->getElementsByTagName('link'); 
    foreach ($links as $link){ 
     $attr = $link->attributes; 
     if ($attr 
       && $attr->getNamedItem('rel')->nodeValue == 'stylesheet' 
       && $attr->getNamedItem('href')->nodeValue == 'http://site.com/style.css'){ 
      $attr->getNamedItem('href')->nodeValue = 'http://site.com/style-member.css' 
     } 
    } 
} 
$str = $dom->saveHTML(); 
+0

嗯,是的,你的第一個選擇應該是相當不錯的,但是,我提供的代碼並不完全想要我真的想在現場使用。我的意思是,除了我不想'style.css'被'style-member.css'替代,但實際上'blue.css'替代'orange.css',幾乎所有這些都是。所以,我想這個解決方案不是我所需要的。對不起。我應該提供正確的名字。所以,做到這一點,我該怎麼辦? – oscarmarcelo

+0

呃......這是一樣的。只有在放置「style.css」的地方,你放上了「orange.css」,並且在「style-member.css」中放置了「blue.css」...... – FrankieTheKneeMan

+0

好吧,我使用了第一個解決方案的一部分。您的解決方案將成爲常見行爲的更好答案,但由於我在兩個CMS之間使用了橋樑(第一個CMS在第二個CMS中搜索主題,然後通過合併代碼來安裝子主題),所以我無法依靠寫在主題上的代碼。這就是爲什麼我必須使用鉤子。現在的結果是:'if(preg_match('#area \ .deprogn \ .com#i',$ _SERVER ['HTTP_HOST'])){$ event-> replace('#orange \ .css#i', 'blue.css'); }'。謝謝! :d – oscarmarcelo

0

如果您要檢查全域名稱使用

if(strtolower($_SEVER['HTTP_HOST'])=='member.site.com'){ 
     // other stuff 
    } 

如果您需要檢查它與REQUEST_URI比

if(preg_match('@^/[email protected]',$_SERVER['REQUEST_URI'])){ 
     // other stuff 
    } 

從完整的URL檢查主機名

if(preg_match('@^(?:http[s]*://)?([^/]+)@i',$url)){ 
     // other stuff 
    } 

注:請記住,如果真的是有一條線,這將與追趕線的beggining工作

preg_match('@^/member/@i','/member/blahstuftuff/member/member/member/me?user=amigo&dir=mber/member') 

你可以測試正則表達式這裏:RegExp online version


編輯

如果希望當用戶在成員網站,如果登錄會話,不僅僅是改設爲CSS:

$_SESSION['member']=true;時登錄,

,並在這樣做頁面的一部分(頭或任何你打算寫CSS文件):

使用與「/成員」開始請求URI:
echo '<link rel="stylesheet" href="http://site.com/'.(preg_match('@^/[email protected]',$_SERVER['REQUEST_URI'])==true&&$_SESSION['member']==true?'blue.css':'orange.css').'"/>';

使用成員域名「member.site.com」
echo '<link rel="stylesheet" href="http://site.com/'.(strtolower($_SEVER['HTTP_HOST'])=='member.site.com'&&$_SESSION['member']==true?'blue.css':'orange.css').'"/>';

如果你想blue.css由未在不是刪除記錄的,即使訪客用戶可以看到會話變量比較!

+0

這不是我所需要的......但無論如何感謝。 – oscarmarcelo

+0

我剛剛編輯:) – diti

相關問題