簡體   English   中英

在PHP中用正則表達式替換字符串

[英]String replace with regex in PHP

我想用php修改html文件的內容。 我正在將樣式應用於img標簽,並且需要檢查標簽是否已經具有style屬性,如果有,我想用自己的標簽替換它。

$pos = strpos($theData, "src=\"".$src."\" style=");
    if (!$pos){
        $theData = str_replace("src=\"".$src."\"", "src=\"".$src."\" style=\"width:".$width."px\"", $theData);
    }
    else{
        $theData = preg_replace("src=\"".$src."\" style=/\"[^\"]+\"/", "src=\"".$src."\" style=\"width: ".$width."px\"", $theData);
    }

$ theData是我收到的html源代碼。 如果未找到樣式屬性,則可以成功插入自己的樣式,但是當已經定義了樣式屬性,因此我的正則表達式無法正常工作時,我認為問題就來了。

我想用我的新樣式屬性將樣式屬性替換為其中的所有內容。 我的正則表達式看起來如何?

與其使用正則表達式,不如使用DOM解析器。

使用DOMDocument的示例:

<?php
$html = '<img src="http://example.com/image.jpg" width=""/><img src="http://example.com/image.jpg"/>';

libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML('<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'.$html);
$dom->formatOutput = true;

foreach ($dom->getElementsByTagName('img') as $item)
{
    //Remove width attr if its there
    $item->removeAttribute('width');

    //Get the sytle attr if its there
    $style = $item->getAttribute('style');

    //Set style appending existing style if necessary, 123px could be your $width var
    $item->setAttribute('style','width:123px;'.$style);
}
//remove unwanted doctype ect
$ret = preg_replace('~<(?:!DOCTYPE|/?(?:html|body|head))[^>]*>\s*~i', '', $dom->saveHTML());
echo trim(str_replace('<meta http-equiv="Content-Type" content="text/html;charset=utf-8">','',$ret));

//<img src="http://example.com/image.jpg" style="width:123px;">
//<img src="http://example.com/image.jpg" style="width:123px;">

?>

這是解決此問題的regexp變體:

<?php
$theData = "<img src=\"/image.png\" style=\"lol\">";
$src = "/image.png";
$width = 10;

//you must escape potential special characters in $src, 
//before using it in regexp
$regexp_src = preg_quote($src, "/");

$theData = preg_replace(
    '/src="'. $regexp_src .'" style=".*?"/i',
    'src="'. $src .'" style="width: '. $width . 'px;"',
    $theData);

print $theData;

印刷品:

<img src="/image.png" style="width: 10px;">

正則表達式:

(<[^>]*)style\s*=\s*('|")[^\2]*?\2([^>]*>)

用法:

$1$3

例:

http://rubular.com/r/28tCIMHs50

搜索:

<img([^>] )style="([^"] )"

並替換為:

<img\\1style="attribute1: value1; attribute2: value2;"

http://regex101.com/r/zP2tV9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM