You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用preg_match()提取字符串中#标记词汇并包裹HTML标签?

解决PHP中提取并替换所有#标记词汇的问题

问题根源

你当前使用的preg_match()函数只会返回第一个匹配项,无法处理字符串中多个被#标记的词汇,这就是为什么只能提取到quick的原因。

直接替换方案(推荐)

如果你的需求是直接将#词汇#替换为指定的HTML标签结构,使用preg_replace()更高效,它会自动处理所有匹配项:

$original = '<p>The #quick# brown fox jumps over the #lazy# dog</p>';
// 匹配被#包裹的内容,非贪婪模式避免跨多个#匹配
$pattern = '/#(.*?)#/';
// 替换为目标HTML结构,$1对应捕获到的词汇
$replace = '<strong>span-tag</strong> $1 <strong>/span-tag</strong>';
$result = preg_replace($pattern, $replace, $original);

echo $result;

执行后输出:

<p>The <strong>span-tag</strong> quick <strong>/span-tag</strong> brown fox jumps over the <strong>span-tag</strong> lazy <strong>/span-tag</strong> dog</p>

对于单个标记的场景(如<p><em>The quick brown fox jumps over the #lazy# dog</em></p>),该代码同样可以正确替换。

提取所有标记词汇的方案

如果需要先提取所有被#包裹的词汇再做其他处理,使用preg_match_all():

$original = '<p>The #quick# brown fox jumps over the #lazy# dog</p>';
$pattern = '/#(.*?)#/';
preg_match_all($pattern, $original, $matches);

// $matches[1] 存储所有提取到的词汇
var_dump($matches[1]);

输出结果:

array(2) {
  [0]=>
  string(5) "quick"
  [1]=>
  string(4) "lazy"
}

正则说明

  • #(.*?)#:#匹配前后的标记,(.*?)是非贪婪捕获组,确保只匹配两个#之间的内容,不会误匹配多个#之间的长文本。
  • $1:在替换字符串中代表捕获组里的内容,也就是被#包裹的词汇。

内容的提问来源于stack exchange,提问作者Wortuoso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:32:26