2 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以使用交替來(lái)匹配src
or?href
,然后使用否定前瞻來(lái)斷言 src/href 不以 開(kāi)頭{{asset
:
((?:src|href)\s*=\s*")((?!{{\s*asset)[^"]+)
這也將更改標(biāo)簽href
內(nèi)<a>
或其他地方的屬性。如果這是一個(gè)問(wèn)題,請(qǐng)改用DOMDocument
解決方案。請(qǐng)注意,如果您的 HTML 不僅僅是一個(gè)片段,那么您不需要div
在對(duì)的調(diào)用中在其周?chē)砑訕?biāo)記loadHTML
,并且最后一行應(yīng)更改為echo substr($doc->saveXML(), 38);
.
$html = <<<EOT
//Find:
<img src="icons/google-icon.svg" >?
//Replace to:?
<img src="{{asset('icons/google-icon.svg')}}" >
//Find:
<link href="css/style.css">?
//Replace to:?
<link href="{{asset('css/style.css')}}">
/** etc... */
<a >
EOT;
$doc = new DOMDocument();
$doc->loadHTML("<div>$html</div>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//img') as $img) {
? ? $src = $img->getAttribute('src');
? ? if (preg_match('/^(?!{{\s*asset).*$/', $src, $m)) {
? ? ? ? $img->setAttribute('src', "{{asset('" . $m[0] . ")'}}");
? ? }
}
foreach ($xpath->query('//link') as $link) {
? ? $href = $link->getAttribute('href');
? ? if (preg_match('/^(?!{{\s*asset).*$/', $href, $m)) {
? ? ? ? $link->setAttribute('href', "{{asset('" . $m[0] . ")'}}");
? ? }
}
// strip XML header and added <div> tag
echo substr($doc->saveXML(), 44, -6);
輸出:
//Find:
<img src="{{asset('icons/google-icon.svg)'}}"/>?
//Replace to:?
<img src="{{asset('icons/google-icon.svg')}}"/>
//Find:
<link href="{{asset('css/style.css)'}}"/>?
//Replace to:?
<link href="{{asset('css/style.css')}}"/>
/** etc... */
<a />

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
這可以/應(yīng)該用 DomDocument 來(lái)完成。
還值得一提的是,在用于訪問(wèn)變異文檔時(shí),將花括號(hào)添加到屬性字符串(它們被編碼)時(shí)會(huì)產(chǎn)生錯(cuò)誤的副作用。saveHTML()
要解決此問(wèn)題,請(qǐng)使用saveXML()
并刪除文檔前面的 xml 標(biāo)記。
我將您的示例標(biāo)簽包裝在父標(biāo)簽中,以便 DomDocument 可以正常運(yùn)行,而不會(huì)破壞您的文檔結(jié)構(gòu)。這可能是您的項(xiàng)目不必要的預(yù)防措施。
我的代碼片段直接使用 XPath 定位符合條件的屬性,并在沒(méi)有任何正則表達(dá)式的情況下替換它們的值。我的 xpath 表達(dá)式中的豎線 (?|
) 表示“或”——因此它以 img 標(biāo)簽的 src 屬性或鏈接標(biāo)簽的 href 屬性為目標(biāo)。
代碼:
$html = <<<HTML
<div>
? ? <img src="icons/example.svg">
? ? <a >a link</a>
? ? <link href="css/example.css">
? ? <iframe src="http://www.example.com/default.htm"></iframe>
</div>
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//img/@src | //link/@href') as $attr) {
? ? $attr->value = "{{asset('" . $attr->value . "')}}";
}
echo substr($dom->saveXML(), 38);? // remove the auto-generated xml tag from the start
輸出:
<div>
? ? <img src="{{asset('icons/example.svg')}}"/>
? ? <a >a link</a>
? ? <link href="{{asset('css/example.css')}}"/>
? ? <iframe src="http://www.example.com/default.htm"/>
</div>
哎呀,我剛剛看到你問(wèn)題中的最后一個(gè)請(qǐng)求。
not()
和的實(shí)現(xiàn)?starts-with()
應(yīng)用于兩個(gè)標(biāo)簽,以取消已經(jīng)轉(zhuǎn)換為小胡子代碼的元素的資格。
新的 xpath 表達(dá)式:
//img[not(starts-with(@src,"{{asset"))]/@src?|?//link[not(starts-with(@href,"{{asset"))]/@href
- 2 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報(bào)