如何用PHP实现可正确解析属性的非WordPress网站BUTTON短代码?
极简短代码转按钮解决方案
你的正则问题在于没有精准区分link和label属性,只是把BUTTON后的所有内容当成href,以下是两种符合你“一两行代码”需求的解决方案:
方案一:灵活处理的回调替换(推荐)
如果属性顺序可能变动或需要兼容可选属性,用preg_replace_callback更稳妥:
$copy = preg_replace_callback('/\[BUTTON(?: link="([^"]+)")?(?: label="([^"]+)")?\]/i', function($m) { $link = htmlspecialchars($m[1] ?? '#'); $label = htmlspecialchars($m[2] ?? 'Button'); return "<a href=\"$link\" class=\"button\">$label</a>"; }, $copy);
- 支持属性顺序任意、可选属性(缺省link用
#,缺省label用Button) - 用
htmlspecialchars转义内容,避免XSS注入 - 忽略大小写(
/i修饰符),兼容[button]小写写法
方案二:单行正则替换(属性顺序固定时)
如果短代码严格遵循link在前、label在后的规则,一行代码即可搞定:
$copy = preg_replace('/\[BUTTON link="([^"]+)" label="([^"]+)"\]/', '<a href="$1" class="button">$2</a>', $copy);
- 直接通过捕获组提取
link和label的属性值,替换到对应位置 - 安全优化版(添加XSS防护):
$copy = preg_replace('/\[BUTTON link="([^"]+)" label="([^"]+)"\]/', '<a href="'.htmlspecialchars('$1').'" class="button">'.htmlspecialchars('$2').'</a>', $copy);
关键说明
- 正则中的
[^"]+用于精准匹配双引号内的属性值,避免误匹配其他内容 - 给a标签添加
class="button"可以方便你用CSS自定义按钮样式
内容的提问来源于stack exchange,提问作者AdamJones
相关产品推荐
相关产品推荐

