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

正则需求:移除#User#至#间内容并提取无空格#包裹串

解决正则匹配与替换的两个需求

嘿,我看你在正则匹配和替换上遇到了两个小问题:一是正确提取以#开头结尾且内部无空格的子串,二是移除#User#到下一个#之间的内容。咱们来逐个解决:


1. 正确提取#开头结尾且无空格的子串

你之前用的preg_match_all("~#(.*?)#~", $str, $matches)之所以得到不符合预期的结果,是因为.*?会匹配从第一个#到最近的#之间的所有内容——包括中间的标点、HTML标签甚至其他字符,完全没有限制内部字符的规则。

要精准匹配像#User#这种「以#包裹、内部无空格」的子串,咱们需要给内部字符加限制:匹配**非空格、非#**的字符。对应的正则如下:

$str = "#User#,<br><br>Thanks#For providing";
preg_match_all("~#([^#\s]+)#~", $str, $matches);
print_r($matches[0]); // 输出:Array ( [0] => #User# )

这里的[^#\s]+是关键:

  • [^...]表示匹配不在括号内的任意字符
  • #和\s(代表空格、制表符等空白字符)被排除在外
  • +确保匹配至少一个字符,避免空的##这种无效子串

这样就能准确提取到符合要求的#User#,而不会碰那些不完整的(比如#For,因为后面没有闭合的#)或者不符合规则的内容。


2. 移除#User#与下一个#之间的内容

要移除#User#到下一个#之间的内容(也就是你的例子里的,<br><br>Thanks),咱们可以用preg_replace来做替换:

$str = "#User#,<br><br>Thanks#For providing";
$modifiedStr = preg_replace("~#User#(.*?)#~", "#User#", $str);
echo $modifiedStr; // 输出:#User#For providing

这里的(.*?)是非贪婪匹配,确保只匹配到#User#之后的第一个#,不会过度匹配后面的内容。如果你的场景里有多个#,这个正则也只会处理#User#之后的第一段目标内容。


如果你的实际场景还有特殊情况(比如内部允许特定符号),可以再调整[^#\s]里的字符范围,但目前这两个方案应该能完美解决你的核心需求。

内容的提问来源于stack exchange,提问作者S. K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:56:58