我有一个包含html代码的字符串,我希望每次在字符串中出现时都将<img src="anything.jpg">
更改为<img src="'.DOC_ROOT .'anything.jpg">
。我真的不想要使用html解析器,因为这将是我唯一能用它的东西。有没有人知道如何在PHP中使用正则表达式这样做?
答案 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);
答案 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'>";
在php中,代码看起来像这样:
$string = "<img src='anything.jpg'>";
echo preg_replace('/img.*?src=[\'\"](.*?)[\'\"]/', "img src='$_SERVER[DOCUMENT_ROOT]/$1'", $string);
警告如果您的DOM包含不规则的HTML(此处和那里放错了标记,=
符号之间的空格),您最终可能会导致很多问题。这就是像domdocument这样的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="<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);