更改img标记的src部分

时间:2014-01-29 17:33:32

标签: php html regex

我有一个包含html代码的字符串,我希望每次在字符串中出现时都将<img src="anything.jpg">更改为<img src="'.DOC_ROOT .'anything.jpg">。我真的想要使用html解析器,因为这将是我唯一能用它的东西。有没有人知道如何在PHP中使用正则表达式这样做?

4 个答案:

答案 0 :(得分:4)

really should use a parser但是由于您明确表示您确实不想这样做,因此您可以使用以下regex replace

$string = preg_replace('/<img([^>]*)src=["\']([^"\'\\/][^"\']*)["\']/', '<img\1src="'.DOC_ROOT.'\2"', $string);

Demo。此正则表达式不会修改任何已经是相对路径的URL。如果您想匹配以下内容,请将其更改为:

$string = preg_replace('/<img([^>]*)src=["\']["\'\\/]?([^"\']*)["\']/', '<img\1src="'.DOC_ROOT.'\2"', $string);

Demo

答案 1 :(得分:3)

如果你必须使用正则表达式而不是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'>";

http://regex101.com/r/vN7lN9

在php中,代码看起来像这样:

$string = "<img src='anything.jpg'>";
echo preg_replace('/img.*?src=[\'\"](.*?)[\'\"]/', "img src='$_SERVER[DOCUMENT_ROOT]/$1'", $string);

警告如果您的DOM包含不规则的HTML(此处和那里放错了标记,=符号之间的空格),您最终可能会导致很多问题。这就是像这样的DOM解析器派上用场的地方。

答案 2 :(得分:1)

很多人都指出使用DOM解析器的重要性,但是很少有答案能真正说明如何执行任务。

正则表达式,即使试图编写单行代码或更改单个字符,也不适合解析html,因为它对DOM无知-它会处理您输入的内容为字符串,仅此而已。我精心设计了正则表达式(根据已接受的答案)将如何进行意外替换的演示。

代码:(Demo

$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="&lt;img" src="anything.jpg"></iframe></p>

如果您需要对img标签的网址进行有条件的替换,则可以使用其他工具(例如网址解析器或Xpath)来满足您的要求。

https://stackoverflow.com/a/60263813/2943403

最终,我的建议是忘记编写多少行代码。只需编写健壮/可靠的代码即可。

答案 3 :(得分:-1)

这就是你要找的东西,我想:

$pictureName = 'anything.jpg';

$html = str_replace($pictureName, DOC_ROOT.$pictureName, $html);