preg_replace 在 src 中的开始和结束处加上附加以替换 cid:

preg_replace plus append at start and end inside src to replace cid:

我有一个 HTML 字符串。出于这个目的,假设字符串是:

<img id="Picture_x0020_1" src="cid:image001.jpg@01D05CBF.CF7A44B0" alt="Variety 008 (893 x 799) (223 x 200)" height="200" width="223">dflkjdslkjdsfldskfjdlfkjdlfksdjfflkdsjfdlkdfdjflkdfjdlkjfkdlfjdljfldjfldjflkdjjfkd<img id="Picture_x0020_1" src="cid:image001.jpg@01D05CBF.CF7A44B0" alt="Variety 008 (893 x 799) (223 x 200)" height="200" width="223">hkjhkhkhkhkhkjhjkhhkjhkjhkjhkjhjkhkjhkjhkhkjhkjhjkhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjh<img id="Picture_x0020_1" src="cid:image001.jpg@01D05CBF.CF7A44B0" alt="Variety 008 (893 x 799) (223 x 200)" height="200" width="223">dsjhfdsjfdjflsjflkjdflkjffldskjfdljdlfkjflkdjflkdjfdslkjfkds

现在让我们看看我需要做一些工作的字符串,这就是 gmail 在 src="":

中保存图像名称的内容

cid:image001.jpg@01D05CBF.CF7A44B0

我用的class下载并保存附件如下:

$cid = 'cid:image001.jpg@01D05CBF.CF7A44B0'; 
$mail_id . '_' . $cid . '_' . $image_id;

所以实际的图像名称是这样的: 308907_image001.jpg@01D05CBF.CF7A44B0_image001.jpg

现在我的目标是替换所有这些事件:

cid:image001.jpg@01D05CBF.CF7A44B0

attachments/308907_image001.jpg@01D05CBF.CF7A44B0_image001.jpg

基本上去掉 cid: 字符串,将 $mail_id 和 _ 附加到字符串的开头,将 _image001.jpg 附加到结尾。

请记住,在 html 字符串

中可能有一堆这些嵌入的 cid src

所以正则表达式不太好,我正在逐步执行此操作,首先我想弄清楚如何用 attachments/308907_image001.jpg 替换 cid:image001.jpg@01D05CBF.CF7A44B0 @01D05CBF.CF7A44B0 然后我会尝试找出如何在末尾附加 _image001.jpg。

我设法构建了突出显示整个图像标签的正则表达式,运行 它在 http://www.regexr.com/ 中突出显示了元素 [1]:

中的 cid: 值

我在想这样的事情,但它只是 returns 一个空字符串,但逻辑似乎在正则表达式工具中有效,所以我无法弄清楚为什么它不起作用,也许是因为正则表达式有 3 个元素我需要访问元素 [1] 以获取 cid: 值,不确定:

$string = preg_replace('/(<img\b\s+.*?src=\")(.*?cid:.*?)(\">)/g', 'attachments/'.$mail_id.'_', $html);

但这里的问题是我只需要用 attachments/308907_ 替换 cid: 而我不想替换 image001.jpg@01D05CBF.CF7A44B0 部分。

我也不确定在末尾附加 _image.jpg 的最佳方法。如果它只是一个替换我可以做这样的事情:

$current_image_name = 'attachments/308907_image001.jpg@01D05CBF.CF7A44B0';
$new_image_name = 'attachments/308907_image001.jpg@01D05CBF.CF7A44B0_image001.jpg';

str_replace($current_image_name, $new_image_name,$html);

但是因为电子邮件中可能有很多这样的内容,所以我认为这种方法行不通,而且性能方面可能不太好,因为在某些情况下某些电子邮件可能很大。

我担心调用的效率不高,因为它在解析时可能是一封大电子邮件,所以也许有一种方法可以在 preg_replace 函数的同时进行调用。

如果有人甚至为我指明了正确的方向并给我一些实现此目标的最佳方法的提示,我很乐意找出实际的代码。

试试这个,

$re = "/src=\\"cid:(.*?)@(.*?)\\"/s"; 
$str = "<img id=\"Picture_x0020_1\" src=\"cid:image001.jpg@01D05CBF.CF7A44B0\" alt=\"Variety 008 (893 x 799) (223 x 200)\" height=\"200\" width=\"223\">dflkjdslkjdsfldskfjdlfkjdlfksdjfflkdsjfdlkdfdjflkdfjdlkjfkdlfjdljfldjfldjflkdjjfkd<img id=\"Picture_x0020_1\" src=\"cid:image001.jpg@01D05CBF.CF7A44B0\" alt=\"Variety 008 (893 x 799) (223 x 200)\" height=\"200\" width=\"223\">hkjhkhkhkhkhkjhjkhhkjhkjhkjhkjhjkhkjhkjhkhkjhkjhjkhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjh<img id=\"Picture_x0020_1\" src=\"cid:image001.jpg@01D05CBF.CF7A44B0\" alt=\"Variety 008 (893 x 799) (223 x 200)\" height=\"200\" width=\"223\">dsjhfdsjfdjflsjflkjdflkjffldskjfdljdlfkjflkdjflkdjfdslkjfkds"; 
$subst = "src=\"attachments/".$mailid."_@_\""; 

$result = preg_replace($re, $subst, $str);

Regex

更新:

图案=/src=\"cid:(.*?)@(.*?)\"/s
src= 匹配字符 src
\"= 按字面意思匹配字符 "
cid:= 匹配字符 cid:

现在,我们必须从字符串中捕获图像名称,以便我们可以将其附加到输出字符串中。在cid:@ 之间可以捕获图像名称。

因此cid:(.*?)@将捕获图像名称。这是模式中的第一个捕获组。 (即</code>)。图像名称将存储到 <code> 中,因为它是第一个捕获的组)。如果你使用 preg_match 那么它将是 $match[1]

然后我们需要@"之间的字符串这是第二个捕获组。所以 @(.*?)"preg_replace 中被称为 </code> 功能。</p> <p>在<code>preg_replace中匹配到的字符串会被存入[=31=]</code>等。在 <code>preg_match 中,匹配的字符串将存储到 $match[0]$match[1] 等中。而 $match 是用户定义的数组名称,它将作为函数中的第三个参数进行解析