亲爱的,
我需要您对下面的正则表达式的支持,我已经研究了过去 5 个小时,但无法弄清楚
define\(\s*[\'"]DB_HOST[\'"]\s*,\s*[\'"]([^\'"]+)[\'"]\)
我的任务很简单,我需要一个正则表达式来提取 WordPress 数据库信息,我将在 Ansible 剧本中使用它
/\*\* The host of the database for WordPress \*/
define( 'DB_HOST', 'database_host_here' );
以上是格式
在 ChatGPT 和其他 GenAI 工具的帮助下,我尝试了不止正则表达式,但由于正则表达式转义问题,每个输出都失败了
这是我当前的剧本
---
- name: Update wp-config.php with new template
hosts: localhost
vars_prompt:
- name: username
prompt: "Enter the username"
private: false
vars:
wp_config_filename: "wp-config.php"
enable_debug: false
multi_site: false
search_paths:
- "/home/{{ username }}/public_html/public"
tasks:
- name: Find wp-config.php files
ansible.builtin.find:
paths: "{{ search_paths }}"
patterns: "{{ wp_config_filename }}"
register: wp_config_files
- name: Fail if no wp-config.php files found
ansible.builtin.fail:
msg: "No wp-config.php files found in the provided paths."
when: wp_config_files.matched == 0
- name: Debug wp-config.php files
ansible.builtin.debug:
var: wp_config_files
- name: Read existing wp-config.php for database credentials
ansible.builtin.slurp:
src: "{{ item.path }}"
loop: "{{ wp_config_files.files }}"
loop_control:
loop_var: item
register: wp_config_content
when: wp_config_files.matched > 0
- name: Decode base64 encoded wp-config.php content
ansible.builtin.set_fact:
wp_config_decoded: "{{ wp_config_content.results | map(attribute='content') | map('b64decode') | list }}"
- name: Debug decoded wp-config.php content
ansible.builtin.debug:
var: wp_config_decoded
- name: Set database credentials from existing wp-config.php
ansible.builtin.set_fact:
db_host: "{{ item | regex_search('define\\(\\s*[\'\"]DB_HOST[\'\"]\\s*,\\s*[\'\"]([^\'\"]+)[\'\"]') | default('localhost') }}"
db_name: "{{ item | regex_search('define\\(\\s*[\'\"]DB_NAME[\'\"]\\s*,\\s*[\'\"]([^\'\"]+)[\'\"]') | default('wordpress') }}"
db_user: "{{ item | regex_search('define\\(\\s*[\'\"]DB_USER[\'\"]\\s*,\\s*[\'\"]([^\'\"]+)[\'\"]') | default('root') }}"
db_password: "{{ item | regex_search('define\\(\\s*[\'\"]DB_PASSWORD[\'\"]\\s*,\\s*[\'\"]([^\'\"]+)[\'\"]') | default('password') }}"
loop: "{{ wp_config_decoded }}"
loop_control:
loop_var: item
- name: Debug extracted database credentials
ansible.builtin.debug:
msg: >
DB Name: {{ db_name }},
DB User: {{ db_user }},
DB Password: {{ db_password }},
DB Host: {{ db_host }}
- name: Create a new wp-config.php from template
ansible.builtin.template:
src: "wp-config.php.j2"
dest: "{{ item.path }}"
mode: "0644"
loop: "{{ wp_config_files.files }}"
when: wp_config_files.matched > 0
我有一个包含多个 WordPress 网站的共享托管环境,我想让所有设置都相同,因此我想自动检测数据库信息,更新模板,并将其放置在正确的路径中。
define\(\s*[\'"]DB_HOST[\'"]\s*,\s*[\'"]([^\'"]+)[\'"]\)
ansible失败了
更新
感谢@WiktorStribiżew,我能够找到问题的解决方案
使用 regex_search for ansible 的新的和更新的正则表达式值
regex_search('define\\s*\\(\\s*[\\x22\\x27]DB_HOST[\\x22\\x27]\\s*,\\s*[\\x22\\x27]([^\\x22\\x27]+)[\\x22\\x27]\\s*\\)', '\\1') | first
如果您无法理解如何在字符串文字中转义双引号和单引号,可以使用一种解决方法来将双引号和单引号添加到正则表达式模式中。这适用于大多数(如果不是全部)NFA 正则表达式引擎。
您可以将
"
与 \x22
以及 '
与 \x27
转义实体相匹配。
所以,你的图案看起来像这样
regex_search('define\\(\\s*[\\x22\\x27]DB_HOST[\\x22\\x27]\\s*,\\s*[\\x22\\x27]([^\\x22\\x27]+)[\\x22\\x27]\\s*\\)')
注意,如果需要从结果中获取组值,则需要将其指定为
regex_search
的第二个参数:
regex_search('define\\(\\s*[\\x22\\x27]DB_HOST[\\x22\\x27]\\s*,\\s*[\\x22\\x27]([^\\x22\\x27]+)[\\x22\\x27]\\s*\\)', '\\1')
由于代码执行的结果是获得一个列表,并且您只需要该列表中的第一项,因此您只需在正则表达式搜索命令后添加
| first
即可。