[英]Change the src part of an img tag
我有一個包含 html 代碼的字符串,我想在每次出現在字符串中時將<img src="anything.jpg">
更改為<img src="'.DOC_ROOT .'anything.jpg">
。 我真的不希望使用HTML解析器,因為這將是我將使用它的唯一的事情。 有誰知道如何在 php 中做到這一點,例如使用正則表達式?
您確實應該使用解析器,但由於您明確表示您真的不想這樣做,您可以使用以下正則表達式替換:
$string = preg_replace('/<img([^>]*)src=["\']([^"\'\\/][^"\']*)["\']/', '<img\1src="'.DOC_ROOT.'\2"', $string);
演示。 此正則表達式不會修改任何已經是相對路徑的 url。 如果您確實想匹配這些,請將其更改為以下內容:
$string = preg_replace('/<img([^>]*)src=["\']["\'\\/]?([^"\']*)["\']/', '<img\1src="'.DOC_ROOT.'\2"', $string);
演示。
如果您絕對必須使用正則表達式而不是 DOM 解析器,則可以使用它。
不確定 DOC_ROOT 來自哪里,因為它不是一個有效的 PHP 變量(可能是一個常量?)。 另請注意,如果您有單引號,您將無法在字符串中使用嵌入變量。
你可能想要更像:
img.*?src=['"](.*?)['"]
替換為:
img src="$_SERVER['DOCUMENT_ROOT']$1"
其中轉換:
echo "<img src='anything.jpg'>"; //into:
echo "<img src='$_SERVER[\'DOCUMENT_ROOT\']/anything.jpg'>";
在 php 中,代碼如下所示:
$string = "<img src='anything.jpg'>";
echo preg_replace('/img.*?src=[\'\"](.*?)[\'\"]/', "img src='$_SERVER[DOCUMENT_ROOT]/$1'", $string);
請注意,如果您的 DOM 包含不規則的 HTML(標簽錯位, =
符號之間有空格),您最終可能會導致很多問題。 這就是像domdocument這樣的 DOM 解析器派上用場的地方。
很多人都說使用 DOM 解析器的重要性,但真正展示如何執行任務的答案太少了。
Regex ,即使很想寫一個單行或更改單個字符,也不適合解析 html,因為它是 DOM 無知的——它將您的輸入視為字符串,僅此而已。 我精心制作了一個正則表達式(來自接受的答案)將如何進行意外替換的演示。
代碼:(演示)
$html = <<<HTML
<p>Some random text <img src="anything.jpg"> text <iframe data-whoops="<img" src="anything.jpg"></iframe></p>
HTML;
define('DOC_ROOT', 'www.example.com/');
echo "With regex:\n";
echo preg_replace('/<img([^>]*)src=["\']([^"\'\\/][^"\']*)["\']/', '<img\1src="'.DOC_ROOT.'\2"', $html);
echo "\n\n---\n\nWith a parser:\n";
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
foreach ($dom->getElementsByTagName('img') as $img) {
$img->setAttribute('src', DOC_ROOT . $img->getAttribute('src'));
}
echo $dom->saveHTML();
輸出:
With regex:
<p>Some random text <img src="www.example.com/anything.jpg"> text <iframe data-whoops="<img" src="www.example.com/anything.jpg"></iframe></p>
---
With a parser:
<p>Some random text <img src="www.example.com/anything.jpg"> text <iframe data-whoops="<img" src="anything.jpg"></iframe></p>
如果您需要對 img 標簽的 url 進行條件替換,還有其他工具,如 url 解析器或 Xpath,可以實現以滿足您的要求。
https://stackoverflow.com/a/60263813/2943403
最后,我的建議是忘記你寫了多少行代碼; 只需編寫健壯/可靠的代碼。
這就是你要找的,我想:
$pictureName = 'anything.jpg';
$html = str_replace($pictureName, DOC_ROOT.$pictureName, $html);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.