【问题标题】:preg_replace function for multiple matches in PHPPHP中多个匹配项的preg_replace函数
【发布时间】:2016-07-02 20:28:06
【问题描述】:

我正在尝试使用 Summer Note js 编辑器获取插入图像字符串的 base64 代码。

我设法得到了这个

preg_replace('#<img\ssrc="data:image/([\w]+);base64,([a-zA-Z0-9+/-_=]+)"\sstyle="width:\s[0-9]+px;">#',"IMAGE REMOVED FROM CHROME\r\n", $content,-1, $counter);

以及一些变化,具体取决于

样式和数据文件名和 src 的位置总是根据不同的浏览器而变化,所以我有一些变化。

1) 有更简单的方法吗?

如果我拥有 img src、样式和数据文件名的所有组件,我将只匹配字符串?我可以创建所有变体,但如果我要为 10 种不同的变体执行 10 次 $content = preg_replace,那么仅仅找到一个匹配项不是非常慢吗?如果我的 $string 非常长,它会变得越来越慢。

2)我需要提取base64字符串保存为图片,如何使用上面的正则表达式来帮助我fopen、fwrite、fclose?

提前致谢。

【问题讨论】:

  • 乱序可以用正则表达式完成。真正的问题是你到底想提取什么?要具体。
  • 我想用文本字符串中的 替换 Img 字符串,然后提供要在其他地方下载的图像。我需要图像文件的 base 64 字符串、数据文件名、扩展名(如果可用)来创建文件,否则我使用 No File Name.imgextension。我相信一旦创建了文件,我就可以找到高度和宽度。
  • 我想我得到了替换工作,只是效率不高,因为我的正则表达式字符串取决于订单。所以我有大约 9 个正则表达式,一些有/没有数据文件名,因为如果使用粘贴到文本字段中,一些浏览器不提供文件名
  • 问题是当我使用 9 个不同的正则表达式时,我尝试使用 preg_match_all 我似乎没有以正确的顺序获得数组,所以我有 10 个不同的 if else 循环
  • 一个快速的解决方案是&lt;img\s+([^&gt;]+)&gt;,然后在回调中,使用另一个替换修改$1,然后返回"&lt;img " + modified + "&gt;"

标签: php regex


【解决方案1】:

你可能会使用这样的东西:

<img(\s+src="data:image/([\w]+);base64,([\w+/-_=]+)")?(\s+style="width:\s*([\d]+)px;")?\s*>

你可以看看这个working example

这样,它涵盖了src 和/或style 属性的缺失。
最终取决于您将其改进为:

  • 将 2 个属性组更改为非捕获,具体取决于您认为它们是否有用
  • 还可以使其内容部分可选,甚至可以选择更丰富(例如,style 可能包含其他属性)

补充几点:

  • 为了面对任何情况,我在属性之间用\s+替换了\s,在style内部用\s*替换
  • 我简化了[a-zA-Z0-9+/-_=]+[0-9]+ 表达式,它们变成了[\w+/-_=]+[\d]+
  • 我在最后一个周围添加了捕获括号(根据您的问题,您似乎需要在可用时获取宽度)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2013-10-28
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多