如何使用正则表达式或数组将输入字符串转换为所需(给定)格式?

How to convert input string to desired(given) format using regex or arrays?

我有这样的用户输入字符串

" |appl | pinea | orang frui | vege lates"

我想把它转换成这种格式

"+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"

我尝试使用 preg_match 和数组,但无法找到解决方案

$term = " |appl | pinea | orang frui | vege lates";

$term = trim($term, "| ");

$term = preg_replace("#[\| ]{2,}#", " | ", $term);

// $term value is "appl | pinea | orang frui | vege lates" after applying safe guards

// $matches = [];
// $matched = preg_match_all("#(\P{Xan}+)\|(\P{Xan}+)#ui", $term, $matches);
// var_dump($matches);

$termArray = explode(" ", $term);

foreach($termArray as $index => $singleWord) {
   $termArray[$index] = trim($singleWord);
}

$termArray = array_filter($termArray);

foreach($termArray as $index => $singleWord) {
   if($singleWord === "|") {

       $pipeIndexes[] = $index;
       $orIndexes[] = $index - 1;
       $orIndexes[] = $index + 1;

       unset($termArray[$index]);

    }

}

// desired string I am hoping for
// "+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"

我希望得到的字符串 "+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"

假设您已将输入字符串清理为以下内容:

appl | pinea | orang frui | vege lates

快速工作示例

https://3v4l.org/NjIai

<?php

$subject = 'appl | pinea | orang frui | vege lates';

// Add the "*" in place at end
$subject = preg_replace('/[a-z]+/i', '[=11=]*', $subject);

// Group the terms adding brackets and + sign
$result = preg_replace('/(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)/i', '+([=11=])', $subject);

var_dump($result);
// Outputs:
// string(53) "+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"

在每个单词后添加*

$result = preg_replace('/[a-z]+/i', '[=12=]*', $subject);

分组基于space

$result = preg_replace('/(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)/i', '+([=13=])', $subject);

可视化

人类可读

(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)

选项:不区分大小写;精确的间距;点不匹配换行符; ^$ 不匹配换行符;贪婪量词;仅正则表达式语法

  • 匹配下面的正则表达式(?:[^\s|]+\s*\|\s*)*
    • 在零次和无限次之间,尽可能多次,按需回馈(贪心)*
    • 匹配下面列表中不存在的任何单个字符 [^\s|]+
      • 一次到无限次之间,尽可能多次,按需回馈(贪心)+
      • 一个“白色space字符”(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)\s
      • 文字字符“|” |
    • 匹配“白色space字符”的单个字符(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)\s*
      • 在零次和无限次之间,尽可能多次,按需回馈(贪心)*
    • 匹配字符“|”字面上 \|
    • 匹配“白色space字符”的单个字符(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)\s*
      • 在零次和无限次之间,尽可能多次,按需回馈(贪心)*
  • 匹配下面的正则表达式(?:[^\s|]+)
    • 匹配下面列表中不存在的任何单个字符 [^\s|]+
      • 一次到无限次之间,尽可能多次,按需回馈(贪心)+
      • 一个“白色space字符”(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)\s
      • 文字字符“|” |

+([=32=])

  • 字面插入字符“+”+
  • 插入左括号(
  • 插入整个正则表达式匹配 [=35=]
  • 插入右括号)