Php 更改img标记的src部分

Php 更改img标记的src部分,php,html,regex,domdocument,Php,Html,Regex,Domdocument,我有一个包含html代码的字符串,我想每次在字符串中出现时都将更改为。我真的不想使用html解析器,因为这将是我使用它的唯一目的。有人知道如何在php中使用正则表达式来实现这一点吗?我认为,这正是您想要的: $pictureName = 'anything.jpg'; $html = str_replace($pictureName, DOC_ROOT.$pictureName, $html); 我想这就是你想要的: $pictureName = 'anything.jpg'; $html

我有一个包含html代码的字符串,我想每次在字符串中出现时都将
更改为
。我真的不想使用html解析器,因为这将是我使用它的唯一目的。有人知道如何在php中使用正则表达式来实现这一点吗?

我认为,这正是您想要的:

$pictureName = 'anything.jpg';

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

我想这就是你想要的:

$pictureName = 'anything.jpg';

$html = str_replace($pictureName, DOC_ROOT.$pictureName, $html);
但既然你明确表示你真的不想这么做,你可以使用以下方法:

$string=preg\u replace('/
。此正则表达式不会修改任何已经是相对路径的URL。如果要匹配这些URL,请将其更改为以下内容:

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

但既然您明确表示不想这样做,您可以使用以下方法:

$string=preg\u replace('/
。此正则表达式不会修改任何已经是相对路径的URL。如果要匹配这些URL,请将其更改为以下内容:

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

.

如果您必须使用正则表达式而不是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'>";
echo”“;//插入:
回声“;

在php中,代码如下所示:

$string = "<img src='anything.jpg'>";
echo preg_replace('/img.*?src=[\'\"](.*?)[\'\"]/', "img src='$_SERVER[DOCUMENT_ROOT]/$1'", $string);
$string=”“;
echo preg\u replace('/img.*?src=[\'\'\'”](.*?[\'\'\'']/',“img src='$\\'服务器[文档根]/$1'”,$string);

请注意如果您的DOM包含不规则的HTML(标记放错了位置,
=
符号之间的空格),您可能会导致很多问题。这就是DOM解析器的用武之地。

如果您必须使用正则表达式而不是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'>";
echo”“;//插入:
回声“;

在php中,代码如下所示:

$string = "<img src='anything.jpg'>";
echo preg_replace('/img.*?src=[\'\"](.*?)[\'\"]/', "img src='$_SERVER[DOCUMENT_ROOT]/$1'", $string);
$string=”“;
echo preg\u replace('/img.*?src=[\'\'\'”](.*?[\'\'\'']/',“img src='$\\'服务器[文档根]/$1'”,$string);

请注意如果您的DOM包含不规则的HTML(标记放错了位置,
=
符号之间的空格)你很可能会导致很多问题。这就是像DOM解析器这样的解析器派上用场的地方。

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

Regex,即使试图编写一行或更改一个字符,也不适合解析html,因为它是DOM无知的——它将您的输入视为字符串,仅此而已。我制作了一个演示,演示了Regex(根据公认的答案)如何进行意外替换

代码:()


$html=很多人都强调使用DOM解析器的重要性,但很少有人真正说明如何执行任务

Regex,即使试图编写一行或更改一个字符,也不适合解析html,因为它是DOM无知的——它将您的输入视为字符串,仅此而已。我制作了一个演示,演示了Regex(根据公认的答案)如何进行意外替换

代码:()


$html=你似乎知道该去哪里找。你试过使用正则表达式吗?嗯,我试过了,但我对正则表达式不太在行,我也没有尝试过任何东西……这是通过解析器实现的,对吧?@Jonan是的,但应该在PHP安装中内置,不需要任何额外的代码,而且与基于字符串的方法相比,它不太可能导致微妙的问题解决方案。你似乎知道该去哪里找。你试过使用正则表达式吗?嗯,我试过了,但我对正则表达式不太在行,我也没有尝试过任何东西……这是用解析器实现的,对吧?@Jonan是的,但应该在PHP安装中内置,不需要任何额外的代码,而且它比基于字符串的sol更不可能导致微妙的问题注意,“anything.jpg”只是一个例子。我希望每个图像src都能在它前面有DOC_ROOT。不过,谢谢:)这个“anything.jpg”只是一个例子。我希望每个图像src都能在它前面有DOC_ROOT。不过,谢谢:)这是一个很好的例子,说明正则表达式的解决方案是多么脆弱。有几种情况会失败:1)如果
img
src
之间有多个空格;2)如果HTML包含XML样式的自关闭标记(
);3) 如果HTML在属性周围使用单引号,而不是双引号;4) 如果img标签包含其他属性,例如
class
id
;5) 如果HTML包含不需要前缀的URL,例如已经指向不同域的URL。@IMSoP我意识到了这一点,这就是为什么我提醒OP他实际上不应该这样做的原因。不过我会改进一下我的正则表达式。是的,正则表达式的解决方案仍然比这个要好得多。问题1、2和3很容易解决;如果您不想假定
src
是第一个属性,那么4就有点棘手了。5是最难的,但是您可以使用否定断言忽略以
http
开头的属性,或者使用
preg\u replace\u callback
通过回调函数运行替换。@IMSoP我想我已经很好地解决了这5个问题。你有没有办法想象它还会破裂?很好。我确信仍然有边缘案例——HTML是一个公司