这些正则表达式快要死了,无论我读什么我都无法理解这个概念。
这是我的问题,我相信它非常容易解决。
[img:http://example.com/_data/025_img.jpg]
我想要的只是用 <img>
更改 [img: ... ] 的位标记并得到如下结果
<img src='http://example.com/_data/025_img.jpg' border='0' />
我尝试了各种愚蠢的变体,但都没有用。不过,我对此并不感到惊讶。
编辑
附加信息:
我的情况如下。
用户将图片上传到他们的个人资料
图像名称存储在数据库中。
- 它们列在带有文本区域的表单旁边
- 在键入文本时,我想通过添加以下标签 [img: ... ] 向用户提供他们的一张或多张图片,其中 ... 是点击图片时将被复制的链接从用户图库中列出。
我正在使用 Codeigniter 并将文本区域通过 View 传递到 Controller -> 模型中,在那里它由一个帮助程序对各种事物进行清理...sql/quotes 等。XSS 也已启用在 CI 上
然后我想扫描文本并查看用户在哪里有 [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/