在Drupal 8中使用正则表达式修改表单标签
解决Drupal表单标签中括号内容添加
<span>样式的问题 看起来你是想给Drupal表单标签里括号内的文本套上<span>标签来做样式,但写的预处理函数没起作用对吧?问题主要是你用preg_split拆分后没正确拼接回带标签的内容,而且代码也没写完。这里给你一个简洁可靠的实现方案:
function THEME_preprocess_form_element_label(&$variables) { $element = $variables['element']; // 确认标题存在且为字符串类型 if (!empty($element['#title']) && is_string($element['#title'])) { $raw_title = $element['#title']; // 正则匹配括号内的内容,替换为带span标签的格式 // 这里的类名可以根据你的需求修改,比如label-note $pattern = '/\((.*?)\)/'; $replacement = '<span class="label-parenthetical">($1)</span>'; // 先转义原始标题防止XSS,再执行替换 $processed_title = preg_replace( $pattern, $replacement, \Drupal\Component\Utility\Html::escape($raw_title) ); // 将处理后的标题标记为安全HTML,避免Drupal自动转义标签 $variables['title'] = \Drupal\Core\Render\Markup::create($processed_title); } }
关键细节说明:
- 正则替换更高效:用
preg_replace直接匹配替换,比拆分再拼接代码更简洁,也避免了拼接时的错误。 - XSS安全防护:先用
Html::escape转义原始标题,再执行替换,防止恶意内容注入。 - 标记安全HTML:通过
Markup::create()告诉Drupal这段内容是安全的HTML,这样模板渲染时不会把<span>转义成文本。 - 缓存刷新:修改预处理函数后,一定要清空Drupal的缓存(比如用
drush cr或者后台的性能设置),否则新代码不会生效!
最后,你可以给.label-parenthetical类添加自定义CSS样式,比如调整字体大小、颜色或者斜体:
.label-parenthetical { font-size: 0.9em; color: #666; font-style: italic; }
内容的提问来源于stack exchange,提问作者Lee Wise
相关产品推荐
相关产品推荐

