2013-08-01 97 views
0

我的問題是如何在這個例子中更換<script>標籤的src值在字符串中一樣(當然,我需要這樣的屬性的更一般的情況下內標籤):PHP的preg_replace財產html標籤內

$data = <<<EOD 
<script language="javascript" src= "../tests/ajax-navigation.js"></script> 
... 
<img src="../404.jpg" alt="404"> 
... 
EOD; 

我用PHP這樣的功能:

class Search{ 
public static function replaceProperty($data, $start, $end, $property, $alias, $limit = -1){ 
    //get blocks formed as: $start $property = "..." $end or $start $property = '...' $end 
    $pattern = "!(".$start."){1}(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)(".$end."){1}!s"; 
    $data = \preg_replace($pattern, "{$start}\${2}{$property}=\"{$alias}\"\${4}{$end}", $data, $limit); 
    return $data; 
} 
} 

我把它叫做是這樣的:

$data = Search::replaceProperty($data, "<script", ">", "src", $alias); 

真奇怪的是,<script><img>都變了! 我當然可以這樣調用它

$data = Search::replaceProperty($data, "<script", "</script>", "src", $alias); 

但這並不回答一般情況下!

只是爲了澄清一些觀點與正則表達式:

我。要搜索的實際字符串是:

$data = <<<EOD 
<script language="javascript" src= "../tests/ajax-navigation.js"></script> 
... 
<script language="javascript" type="text/javascript"> 
... 
<img src="../404.jpg" alt="404"> 
... 
EOD; 

ii。正則表達式$pattern = "!(".$start."){1}(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)(".$end."){1}!s";或在最簡單的形式$pattern = "%".$start."(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)".$end."%s";(僅3子模式)標識第一<script>預期。但它需要第二<script>並終止在第一<img>>改變任何src財產它之間找到了!

iii。通過在導致$pattern = "%".$start."(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)".$end."%";表現爲預期,但失敗時,標籤與破碎的圖案的端刪除s元字符進入:

<script language="javascript" src= "../tests/ajax-navigation.js" 
></script> 

IV。當然我的意圖是替換而不是刪除src屬性的值。

希望這些說明我的問題。

+1

我決定使用DOMDocument並在這裏發佈一個問題:http://stackoverflow.com/questions/18031974/replace-property-of-an-html-tag-with-phps-domdocument – centurian

回答

0

改變這一行:

public static function replaceProperty($data, $start, $end, $property, $alias, $limit = -1){ 

要這樣:

public static function replaceProperty($data, $start, $end, $property, $alias='', $limit = -1){ 

添加的默認值 '' 到$別名參數。

還不確定preg_replace前面的反斜槓在那裏做什麼。我也必須刪除它。

+0

感謝您的回答,它似乎我沒有很好地解釋我的$ alias變量:應該得到任何值,比如$ alias =「這裏有一些值」。我的目的是取代不刪除src屬性! (我的反斜槓表示php的命名空間,因爲我所有的代碼都在不同的命名空間下) – centurian

0

下面是我用preg_match_all查找某個元素的所有代碼,我發現preg_match_all比preg_match更好。

$arr = array(); 
preg_match_all("%[<]script.*?[>](.*?)[<][\/]script[>]%",$f, $arr, PREG_OFFSET_CAPTURE); 
var_dump($arr); 

或者用了preg_replace:

$a = preg_replace("%[<]H3.*?[>].*?[<][\/]H3[>]%", "", $a); 

嘗試的preg_match所有,而下面我用把<>像[<] $開始傳遞<的功能,而不是語法。另外,還要確保它不區分大小寫使用%,此前各自的preg_match選項或使用之前轉換用strtolower所有數據。我敢肯定,如果這樣做可以讓你自己找出其他問題。

+0

嘗試解決方案... 1)沒有爲preg_replace()工作... – centurian

0

正如我所說的,我會用DOMDocument()但這裏是正則表達式的答案:

class Search{ 

public function __construct(){} 

public static function replaceProperty($data, $tag, $property, $alias, $limit = -1){ 
    //get blocks formed as: <$tag...$property=["|']...["|']...[/>|>] 
    $pattern = '%<\s*'.$tag.'(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\4\s*)?)*\s*(\/>|>)%s'; 
    $result = \preg_match_all($pattern, $data, $matches, PREG_PATTERN_ORDER); 
    if(!empty($result)){ 
     $search = array(); 
     $replace = array(); 
     //found them at index = 0! 
     foreach($matches[0] as $i=>$found){ 
     if(($limit >= 0) && ($i >= $limit)) 
      break; 
     if(isset($matches[2]) && isset($matches[5]) && $matches[2][$i] == $property){ 
      $search[] = $found; 
      $replace[] = \str_replace($matches[5][$i], $alias, $found); 
     } 
     } 
     $data = \str_replace($search, $replace, $data); 
    } 
    return $data; 
} 
} 

,並呼籲像這樣:

$data = Search::replaceProperty($data, "script", "src", $alias); 

我用埃馬努埃萊德爾重創的回答從this後可能是this等帖子的複製!
謝謝。