php - 使用 preg_replace 将字符串转换为 <img> 标签

标签 php preg-replace

这些正则表达式快要死了,无论我读什么我都无法理解这个概念。

这是我的问题,我相信它非常容易解决。

[img:http://example.com/_data/025_img.jpg]

我想要的只是用 <img> 更改 [img: ... ] 的位标记并得到如下结果

<img src='http://example.com/_data/025_img.jpg' border='0' />

我尝试了各种愚蠢的变体,但都没有用。不过,我对此并不感到惊讶。

编辑

附加信息:

我的情况如下。

  1. 用户将图片上传到他们的个人资料

  2. 图像名称存储在数据库中。

  3. 它们列在带有文本区域的表单旁边
  4. 在键入文本时,我想通过添加以下标签 [img: ... ] 向用户提供他们的一张或多张图片,其中 ... 是点击图片时将被复制的链接从用户图库中列出。
  5. 我正在使用 Codeigniter 并将文本区域通过 View 传递到 Controller -> 模型中,在那里它由一个帮助程序对各种事物进行清理...sql/quotes 等。XSS 也已启用在 CI 上

  6. 然后我想扫描文本并查看用户在哪里有 [img: ... ] 标签并将其交换为 <img>标记并使用图像后跟文本呈现帖子。

因此,用户的实际输入将类似于

The brown fox jumped over foo bar [img:http://example.com/_data/025_img.jpg] and then went to bed [img:http://example.com/_data/0277_img.jpg] while thinking about [img:http://example.com/_data/1115_img.jpg]

这就是我要求使用 preg_replace 而不是 preg_match 的原因。 preg_match 不会使文本跟随图像。

最佳答案

让我们先解决简单的问题。

/\[img:([^\]]+)\]/

即:

  • 文字[img:
  • 一个捕获组包含
    • 一个字符类组成
      • 不是文字的东西 ]
    • 至少重复一次
  • 文字]

通过 preg_match 运行它,匹配数组中的元素 1 很可能是一个图像 URL,您可以轻松地将其插入到 img 标记中。

但你不应该这样做。不是马上。

首先,这是非常不安全的。当我写这个时会发生什么?

[img:javascript:alert(document.cookie);]

呃。那可不好。

可能想要确保用户声称是 URL 的东西确实是 URL。您可以通过调用 parse_url 来尝试执行此操作。它将返回一组 URL 组件。确保事物具有域和路径,并通过 HTTP 或 HTTPS 提供服务。

好的,但是当用户输入 this 时会发生什么?

[img:http://www.example.com/foo.jpg" onmouseover="alert(document.cookie)"]

这是一个有效的...大概... URL,它将被 parse_url 成功解构,并且很可能通过基本的格式检查。过滤掉空格和引号(单 双引号)将是一个很好的起点,但还有更多事情需要担心。

最重要的是,像这样的标记是 XSS, or Cross-site scripting vulnerabilities 中的向量。

您可以可能通过将 URL 传递到 htmlspecialchars 来减轻一些威胁。这至少会破坏引号和括号,并且很难对那些被照顾的人感到讨厌。请注意字符集的愚蠢性,一些非 UTF-8 字符编码可能包含 ASCII 引号...

可能想为此使用真正的标记语言(即使它只是 Markdown ),并且您可能想使用基于白名单的 HTML 过滤器,例如 HTML Purifier在结果上。这将有助于保护您免受某种程度的精神错乱。

请记住,只有当他们没有出去找你时,你才是偏执狂。网络上到处都是愚蠢到恶意的人,以及恶意到愚蠢的人。

关于php - 使用 preg_replace 将字符串转换为 <img> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13786262/

相关文章:

php - Wordpress 如何向所有 SETCOOKIE() 函数添加 httponly 和安全标志?

php - 不重复地循环和排序结果

php - 操作 JSON

php - 为什么在我的系统中默认的 PHP 时区是 "Europe/Moscow"?

php - 查找 <a> 和 </a> 标记内的文本

php preg_replace() 索引数组问题

php - 你如何编写一个 Wordpress 函数来将 Span 放在标题的第一个单词周围?

php - PHP 和 MySQL 中的评级系统

php - preg_replace、preg_replace_callback 和数组到字符串的转换

php - preg_replace 带有/e修饰符的代码评估